Python socket聊天室程序

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 :

系统监视:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Golang测试技术

本篇文章内容来源于Golang核心开发组成员Andrew Gerrand在Google I/O 2014的一次主题分享“Testing Techniques”,...

3937
来自专栏分布式系统进阶

Kafka源码分析-启动流程

使用getPropsFromArgs方法来获取各配置项, 然后将启动和停止动作全部代理给KafkaServerStartable类;

2100
来自专栏逍遥剑客的游戏开发

WinSock学习笔记(一)

2527
来自专栏软件开发

前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite

AngularJS功能最基本的组件之一是服务(Service)。服务为你的应用提供基于任务的功能。服务可以被视为重复使用的执行一个或多个相关任务的代码块。

1433
来自专栏沃趣科技

看各路神仙如何大战MySQL insecure warning报警有感

一、问题由来 mysql在5.6.5上开始在命令行中直接填入用户密码会提示错误,例如: $./mysql -h10.10.30.18 -uwoqutech -p...

4558
来自专栏解Bug之路

从linux源码看socket的阻塞和非阻塞 顶

笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。 大部分高性能网络框架采用的是非阻塞模式。笔者这次就从linux源码...

1212
来自专栏Ken的杂谈

ASP.NET(C#) 发送邮件帮助类Mailhelper

1871
来自专栏Golang语言社区

Golang测试技术

本篇文章内容来源于Golang核心开发组成员Andrew Gerrand在Google I/O 2014的一次主题分享“Testing Techniques”,...

4006
来自专栏用户2442861的专栏

Settings.xml文件详解

如果在Eclipse中使用过Maven插件,想必会有这个经验:配置settings.xml文件的路径。

3461
来自专栏软件开发

前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite

一、服务 AngularJS功能最基本的组件之一是服务(Service)。服务为你的应用提供基于任务的功能。服务可以被视为重复使用的执行一个或多个相关任务的代码...

2225

扫码关注云+社区

领取腾讯云代金券