前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python socket聊天室程序

Python socket聊天室程序

作者头像
bear_fish
发布2018-09-20 16:02:45
1.6K0
发布2018-09-20 16:02:45
举报
文章被收录于专栏:用户2442861的专栏

http://blog.csdn.net/calling_wisdom/article/details/42524745

今天用python的socket模块实现了一个聊天室的程序

虽然功能比较简单,但是该有的基本功能还是有的

还望大家指点

服务器端程序:

[python] view plaincopyprint?

  1. import socket  
  2. import threading  
  3. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  4. sock.bind(('localhost', 5550))  
  5. sock.listen(5)  
  6. print('Server', socket.gethostbyname('localhost'), 'listening ...')  
  7. mydict = dict()  
  8. mylist = list()  
  9. #把whatToSay传给除了exceptNum的所有人
  10. def tellOthers(exceptNum, whatToSay):  
  11. for c in mylist:  
  12. if c.fileno() != exceptNum :  
  13. try:  
  14.                 c.send(whatToSay.encode())  
  15. except:  
  16. pass
  17. def subThreadIn(myconnection, connNumber):  
  18.     nickname = myconnection.recv(1024).decode()  
  19.     mydict[myconnection.fileno()] = nickname  
  20.     mylist.append(myconnection)  
  21. print('connection', connNumber, ' has nickname :', nickname)  
  22.     tellOthers(connNumber, '【系统提示:'+mydict[connNumber]+' 进入聊天室】')  
  23. while True:  
  24. try:  
  25.             recvedMsg = myconnection.recv(1024).decode()  
  26. if recvedMsg:  
  27. print(mydict[connNumber], ':', recvedMsg)  
  28.                 tellOthers(connNumber, mydict[connNumber]+' :'+recvedMsg)  
  29. except (OSError, ConnectionResetError):  
  30. try:  
  31.                 mylist.remove(myconnection)  
  32. except:  
  33. pass
  34. print(mydict[connNumber], 'exit, ', len(mylist), ' person left')  
  35.             tellOthers(connNumber, '【系统提示:'+mydict[connNumber]+' 离开聊天室】')  
  36.             myconnection.close()  
  37. return
  38. while True:  
  39.     connection, addr = sock.accept()  
  40. print('Accept a new connection', connection.getsockname(), connection.fileno())  
  41. try:  
  42. #connection.settimeout(5)
  43.         buf = connection.recv(1024).decode()  
  44. if buf == '1':  
  45.             connection.send(b'welcome to server!')  
  46. #为当前连接开辟一个新的线程
  47.             mythread = threading.Thread(target=subThreadIn, args=(connection, connection.fileno()))  
  48.             mythread.setDaemon(True)  
  49.             mythread.start()  
  50. else:  
  51.             connection.send(b'please go out!')  
  52.             connection.close()  
  53. except :    
  54. pass

客户端程序:

[python] view plaincopyprint?

  1. import socket  
  2. import time  
  3. import threading  
  4. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  5. sock.connect(('localhost', 5550))  
  6. sock.send(b'1')  
  7. print(sock.recv(1024).decode())  
  8. nickName = input('input your nickname: ')  
  9. sock.send(nickName.encode())  
  10. def sendThreadFunc():  
  11. while True:  
  12. try:  
  13.             myword = input()  
  14.             sock.send(myword.encode())  
  15. #print(sock.recv(1024).decode())
  16. except ConnectionAbortedError:  
  17. print('Server closed this connection!')  
  18. except ConnectionResetError:  
  19. print('Server is closed!')  
  20. def recvThreadFunc():  
  21. while True:  
  22. try:  
  23.             otherword = sock.recv(1024)  
  24. if otherword:  
  25. print(otherword.decode())  
  26. else:  
  27. pass
  28. except ConnectionAbortedError:  
  29. print('Server closed this connection!')  
  30. except ConnectionResetError:  
  31. print('Server is closed!')  
  32. th1 = threading.Thread(target=sendThreadFunc)  
  33. th2 = threading.Thread(target=recvThreadFunc)  
  34. threads = [th1, th2]  
  35. for t in threads :  
  36.     t.setDaemon(True)  
  37.     t.start()  
  38. t.join()  

代码执行效果图:

聊天过程1:

系统监视:

聊天过程 2 :

系统监视:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年01月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档