python socket编程(客户端+服务器)

举报
一颗小树x 发表于 2020/12/04 00:59:19 2020/12/04
【摘要】 python socket编程(客户端+服务器) 1. 此方案适用于 多个客户端通信,结合了线性开发,服务器能同时处理多台信息。  2. 客户端,想要有多台客户端,大家复制一下代码,然后改一下窗口名,然后运行就可以 : #win.title("客户端2")   #win.title("客户端1") 3.客户端的 userName 可以...

python socket编程(客户端+服务器)

1. 此方案适用于 多个客户端通信,结合了线性开发,服务器能同时处理多台信息。 

2. 客户端,想要有多台客户端,大家复制一下代码,然后改一下窗口名,然后运行就可以 :

#win.title("客户端2")  

#win.title("客户端1")

3.客户端的 userName 可以自由选取。

 

服务器


  
  1. import tkinter
  2. import socket, threading
  3. win = tkinter.Tk() # 创建主窗口
  4. win.title('模拟服务器')
  5. win.geometry("400x400+200+20")
  6. users = {}#用户字典,也可以连接数据库
  7. def run(ck, ca):
  8. userName = ck.recv(1024)#接受客户端发送的信息以1k作为单位这里接受到的信息为byte类型
  9. users[userName.decode("utf-8")] = ck#解码并储存用户的信息
  10. #print(users)
  11. printStr = "" + userName.decode("utf-8") + "连接\n"#在连接显示框中显示是否连接成功
  12. text.insert(tkinter.INSERT, printStr)
  13. while True:
  14. rData = ck.recv(1024)#接受客户端发送的信息以1k作为单位这里接受到的信息为byte类型
  15. dataStr = rData.decode("utf-8")
  16. infolist = dataStr.split(":")#分割字符串从而得到所要发送的用户名和客户端所发送的信息
  17. users[infolist[0]].send((userName.decode("utf-8") + "说" + infolist[1]).encode("utf"))
  18. #要发送信息的客户端向目标客户端发送信息
  19. def start():
  20. ipStr = eip.get()#从输入端中获取ip
  21. portStr = eport.get()#从输入端中获取端口,注意端口取得时候不能被占用(可以取8080,9876,等)
  22. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#socked所准守ipv4或ipv6,和相关协议的
  23. server.bind((ipStr, int(portStr)))#绑定ip和端口号!!!1:注意输入的端口号是str型而这里的要传入int型
  24. #2:bind()的参数是一个元组的形式
  25. server.listen(10)#设置监听,和设置连接的最大的数量
  26. printStr = "服务器启动成功\n"#,是否连接成功
  27. text.insert(tkinter.INSERT, printStr)#显示在信息窗口中
  28. while True:#这里用死循环是因为模拟的服务器要一直运行
  29. ck, ca = server.accept()#接受所连接的客户端的信息
  30. # 其中ca是ip和端口号组成的元组,ck有关客户端的信息
  31. t = threading.Thread(target=run, args=(ck, ca))#每连接一个客户端就开启一个线程
  32. #其中Thread函数中的传入函数的参数也是以元组的形式
  33. t.start()#开启线程
  34. def startSever():
  35. s = threading.Thread(target=start)#启用一个线程开启服务器
  36. s.start()#开启线程
  37. #下面是关于界面的操作
  38. labelIp = tkinter.Label(win, text='ip').grid(row=0, column=0)
  39. labelPort = tkinter.Label(win, text='port').grid(row=1, column=0)
  40. eip = tkinter.Variable()
  41. eport = tkinter.Variable()
  42. entryIp = tkinter.Entry(win, textvariable=eip).grid(row=0, column=1)
  43. entryPort = tkinter.Entry(win, textvariable=eport).grid(row=1, column=1)
  44. button = tkinter.Button(win, text="启动", command=startSever).grid(row=2, column=0)
  45. text = tkinter.Text(win, height=4, width=30)
  46. labeltext = tkinter.Label(win, text='连接消息').grid(row=3, column=0)
  47. text.grid(row=3, column=1)
  48. text2 = tkinter.Text(win, height=5, width=30)
  49. labeltext2 = tkinter.Label(win, text='接收消息').grid(row=10, column=0)
  50. text2.grid(row=10, column=1)
  51. win.mainloop()

 

运行结果:

 

客户端1 


  
  1. import tkinter
  2. import socket
  3. import threading
  4. win = tkinter.Tk()
  5. win.title("客户端1")
  6. win.geometry("400x400+200+20")
  7. ck = None#用于储存客户端的信息
  8. def getInfo():
  9. while True:
  10. data = ck.recv(1024)#用于接受服务其发送的信息
  11. text.insert(tkinter.INSERT, data.decode("utf-8"))#显示在信息框上
  12. def connectServer():
  13. global ck
  14. ipStr = eip.get()
  15. portStr = eport.get()
  16. userStr = euser.get()
  17. client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#socked所准守ipv4或ipv6,和相关协议的
  18. client.connect((ipStr, int(portStr)))#连接ip和端口号!!!1:注意输入的端口号是str型而这里的要传入int型
  19. #2:bind()的参数是一个元组的形式
  20. client.send(userStr.encode("utf-8"))
  21. ck = client
  22. t = threading.Thread(target=getInfo)
  23. t.start()
  24. def sendMail():
  25. friend = efriend.get()
  26. sendStr = esend.get()
  27. sendStr = friend + ":" + sendStr
  28. ck.send(sendStr.encode("utf-8"))
  29. #下面是界面
  30. labelUse = tkinter.Label(win, text="userName").grid(row=0, column=0)
  31. euser = tkinter.Variable()
  32. entryUser = tkinter.Entry(win, textvariable=euser).grid(row=0, column=1)
  33. labelIp = tkinter.Label(win, text="ip").grid(row=1, column=0)
  34. eip = tkinter.Variable()
  35. entryIp = tkinter.Entry(win, textvariable=eip).grid(row=1, column=1)
  36. labelPort = tkinter.Label(win, text="port").grid(row=2, column=0)
  37. eport = tkinter.Variable()
  38. entryPort = tkinter.Entry(win, textvariable=eport).grid(row=2, column=1)
  39. button = tkinter.Button(win, text="启动", command=connectServer).grid(row=3, column=0)
  40. text = tkinter.Text(win, height=5, width=30)
  41. labeltext= tkinter.Label(win, text="显示消息").grid(row=4, column=0)
  42. text.grid(row=4, column=1)
  43. esend = tkinter.Variable()
  44. labelesend = tkinter.Label(win, text="发送的消息").grid(row=5, column=0)
  45. entrySend = tkinter.Entry(win, textvariable=esend).grid(row=5, column=1)
  46. efriend = tkinter.Variable()
  47. labelefriend= tkinter.Label(win, text="发给谁").grid(row=6, column=0)
  48. entryFriend = tkinter.Entry(win, textvariable=efriend).grid(row=6, column=1)
  49. button2 = tkinter.Button(win, text="发送", command=sendMail).grid(row=7, column=0)
  50. win.mainloop()

 

客户端2 


  
  1. import tkinter
  2. import socket
  3. import threading
  4. win = tkinter.Tk()
  5. win.title("客户端2")
  6. win.geometry("400x400+200+20")
  7. ck = None#用于储存客户端的信息
  8. def getInfo():
  9. while True:
  10. data = ck.recv(1024)#用于接受服务其发送的信息
  11. text.insert(tkinter.INSERT, data.decode("utf-8"))#显示在信息框上
  12. def connectServer():
  13. global ck
  14. ipStr = eip.get()
  15. portStr = eport.get()
  16. userStr = euser.get()
  17. client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#socked所准守ipv4或ipv6,和相关协议的
  18. client.connect((ipStr, int(portStr)))#连接ip和端口号!!!1:注意输入的端口号是str型而这里的要传入int型
  19. #2:bind()的参数是一个元组的形式
  20. client.send(userStr.encode("utf-8"))
  21. ck = client
  22. t = threading.Thread(target=getInfo)
  23. t.start()
  24. def sendMail():
  25. friend = efriend.get()
  26. sendStr = esend.get()
  27. sendStr = friend + ":" + sendStr
  28. ck.send(sendStr.encode("utf-8"))
  29. #下面是界面
  30. labelUse = tkinter.Label(win, text="userName").grid(row=0, column=0)
  31. euser = tkinter.Variable()
  32. entryUser = tkinter.Entry(win, textvariable=euser).grid(row=0, column=1)
  33. labelIp = tkinter.Label(win, text="ip").grid(row=1, column=0)
  34. eip = tkinter.Variable()
  35. entryIp = tkinter.Entry(win, textvariable=eip).grid(row=1, column=1)
  36. labelPort = tkinter.Label(win, text="port").grid(row=2, column=0)
  37. eport = tkinter.Variable()
  38. entryPort = tkinter.Entry(win, textvariable=eport).grid(row=2, column=1)
  39. button = tkinter.Button(win, text="启动", command=connectServer).grid(row=3, column=0)
  40. text = tkinter.Text(win, height=5, width=30)
  41. labeltext= tkinter.Label(win, text="显示消息").grid(row=4, column=0)
  42. text.grid(row=4, column=1)
  43. esend = tkinter.Variable()
  44. labelesend = tkinter.Label(win, text="发送的消息").grid(row=5, column=0)
  45. entrySend = tkinter.Entry(win, textvariable=esend).grid(row=5, column=1)
  46. efriend = tkinter.Variable()
  47. labelefriend= tkinter.Label(win, text="发给谁").grid(row=6, column=0)
  48. entryFriend = tkinter.Entry(win, textvariable=efriend).grid(row=6, column=1)
  49. button2 = tkinter.Button(win, text="发送", command=sendMail).grid(row=7, column=0)
  50. win.mainloop()

 

先看一下总体运行结果:

 


 

 

希望对你有帮助。

 

 

 

 

 

 

 

文章来源: guo-pu.blog.csdn.net,作者:一颗小树x,版权归原作者所有,如需转载,请联系作者。

原文链接:guo-pu.blog.csdn.net/article/details/84503328

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。