import socketserver
import threading#启动服务
class Myhandler(socketserver.BaseRequestHandler):def setup(self):super().setup()self.event = threading.Event()def handle(self):super().handle()print(self.server,self.client_address,self.request)while not self.event.wait(1):data = self.request.recv(1024)msg = 'Your msg = {}'.format(data.decode()).encode()print(msg)self.request.send(msg)def finish(self):super().finish()self.event.set()addr = ('127.0.0.1',9999)
server = socketserver.ThreadingTCPServer(addr,Myhandler)server.serve_forever()print('-------------[end]--------------------')
server.shutdown()server.server_close()

运行结果:

<socketserver.ThreadingTCPServer object at 0x7f1c59c66a58> ('127.0.0.1', 59624) <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 59624)>
b'Your msg = hello\r\n'
b'Your msg = python\r\n'
b'Your msg = quit\r\n'
b'Your msg = '
b'Your msg = '

改进:

import socketserver
import threading
import logginglogging.basicConfig(level=logging.INFO)class MyHandler(socketserver.BaseRequestHandler):# 客户端信息clients = {}def setup(self):self.event = threading.Event()def handle(self):# 接受到了数据,分发conn = self.requestself.clients[self.client_address] = connwhile not self.event.is_set():try:data = conn.recv(1024).decode().strip()#处理客户段主动断开的异常(非quit)if not data:raise BrokenPipeErrorexcept Exception as e:logging.info(e)data = 'quit'logging.info(data)# 客户端通知,退出机制if data == 'quit':logging.info('quit!')breakmsg = 'ack {}\n'.format(data)for c in self.clients.values():c.send(msg.encode())def finish(self):super().finish()self.event.set()self.clients.pop(self.client_address)ip = '127.0.0.1'
port = 9999
addr = (ip, port)
server = socketserver.ThreadingTCPServer(addr, MyHandler)
threading.Thread(target=server.serve_forever, name='myserver', daemon=True).start()  # 需等待客户端退出后,主线程才能正常结束import myutilsmyutils.showthreads()while True:cmd = input('>>>>').strip()if cmd == 'quit':server.shutdown()server.server_close()break



运行结果:

>>>>INFO:root:[<_MainThread(MainThread, started 140073430714112)>, <Thread(myserver, started daemon 140073405835008)>, <Thread(showthread, started daemon 140073397442304)>]
INFO:root:[<_MainThread(MainThread, started 140073430714112)>, <Thread(myserver, started daemon 140073405835008)>, <Thread(Thread-1, started 140073389049600)>, <Thread(Thread-2, started 140073177708288)>, <Thread(showthread, started daemon 140073397442304)>]
INFO:root:hello
INFO:root:[<_MainThread(MainThread, started 140073430714112)>, <Thread(myserver, started daemon 140073405835008)>, <Thread(Thread-1, started 140073389049600)>, <Thread(Thread-2, started 140073177708288)>, <Thread(showthread, started daemon 140073397442304)>]
INFO:root:python
INFO:root:quit
INFO:root:quit!
INFO:root:[<_MainThread(MainThread, started 140073430714112)>, <Thread(myserver, started daemon 140073405835008)>, <Thread(Thread-2, started 140073177708288)>, <Thread(showthread, started daemon 140073397442304)>]
INFO:root:quit
INFO:root:quit!
INFO:root:[<_MainThread(MainThread, started 140073430714112)>, <Thread(myserver, started daemon 140073405835008)>, <Thread(showthread, started daemon 140073397442304)>]
quit

实用:python网络开发中多人聊天室的实现(socketserver)相关推荐

  1. 编写敏感词过滤程序 说明:在网络程序中,如聊天室、聊天软件等,经常需要对一些用户所提交的聊天内容中的敏感性词语进行过滤。 如“性”、“色情”、“爆炸”、“恐怖”、“枪”、“军火”等,这些都不可以在网

    编写敏感词过滤程序 说明:在网络程序中,如聊天室.聊天软件等,经常需要对一些用户所提交的聊天内容中的敏感性词语进行过滤. 如"性"."色情"."爆炸& ...

  2. linux网络编程TCP多人聊天室

    用socket实现一个多人聊天室的思路很简单,即在服务器端定义一个fd的int型数组,用来存储已经连接的客户端的socket连接套接字fd(因为发送和接收数据都只需要借助连接套接字fd),当服务器接收 ...

  3. Python中基于TCP网络通信协议的多人聊天室

    1.服务端设置 1.1 相关配置信息 便于后期维护修改,将数据协议的相关配置和服务器配置,以及登录验证的数据库信息单独建立一个.py文件.需根据自己服务器ip修改. #------数据协议相关配置-- ...

  4. 网络编程项目—— 多人聊天室->双人聊天

    一.Coding前的思考和步骤梳理 1. 又开始思考这个问题,拿到一个需求,是调用java底层的代码写1000行实现,还是直接调第三方库写50行实现? 都一样. 发现第一次写shell的时候其实思考过 ...

  5. 基于 Vue 开发一个 多人聊天室(万字长文) - 从 0 到 1 篇

    前言 在上个月初,接到一个需求,要开发一个 聊天通讯 模块 并且 集成到 项目中的多个 入口,实现业务数据的记录追踪. 接到需求后,还挺开心,这是我第一次 搞 通讯 类的需求,之前一直是 B 端 的业 ...

  6. 基于Python的多人聊天室的设计与实现

    基于Python的多人聊天室的设计与实现 摘要  本文介绍了基于即时通讯的Python实现web版多人聊天室的设计和实现.这个系统利用了多种先进的技术,如Django.Channels.WebSock ...

  7. 微信小程序用云开发实现多人聊天2020/05/21

    微信小程序用云开发实现多人聊天室 微信小程序用云开发实现多人聊天2020/05/21 效果图片 js wxml wxss 微信小程序用云开发实现多人聊天2020/05/21 用微信云开发实现聊天室 无 ...

  8. Python实现网络多人聊天室

    网络多人聊天室 相关连接:Python实现网络图形化界面多人聊天室 文件结构: chatroom ├── client.py  # 客户端代码 ├── language.py  # 语言文件 ├── ...

  9. 基于Python Tkiner、thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信

    基于Python Tkiner.thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信 完整代码下载地址:基于Python Tkiner.thread与soc ...

最新文章

  1. oracle 枚举_枚举导出为sql语句java实现
  2. array python 交集_NMS原理(非极大值抑制)+python实现
  3. Linux系统下区别对比(~、/home与/root)
  4. flex与JavaScript的数据交互
  5. C语言相反次序重新排序
  6. java单元测试的编写及运行方法
  7. DSP 基于 TMS320F2803x 的 I2C 上的 PMBus 的软件应用
  8. wifi信号增强android,WiFi信号增强大师
  9. codesmith for java_codesmith 入门介绍【转载】
  10. hdu 2122 最小生成树
  11. 拼多多的羊毛被谁薅了?
  12. java色号_RGB颜色与16进制颜色的换算方法
  13. 成功的自动化测试:测试员的故事
  14. 用科傻软件,求平面网和高程网的平差
  15. linux vi 删除行命令,在Vim/Vi中删除行、多行、行范围、所有行及包含模式的行
  16. xcode升级到14后出现error build
  17. Zstack home 1.2.2a兼容对接ZHA标准设备和2.5.1a私有设备
  18. Thrift入门及Java实例
  19. pyqt5 地图可视化 网页地图 folium
  20. 机器学习的相关代码汇总

热门文章

  1. 离散数学-一阶逻辑等值式与置换规则
  2. gcc/g++ -O 优化选项说明
  3. 删除交换机和路由器配置信息
  4. 判断推理——类比推理
  5. 前端必备 PS三种切图方法 Cutterman最好用的切图工具
  6. ET5.0 UGUI替换为FairyGUI
  7. 基于Docker的CaaS容器云平台架构设计及市场分析
  8. 全球及中国自然循环蒸发器行业研究及十四五规划分析报告
  9. 生信分析流程框架概述
  10. 从赛博朋克2077看未来互联网科技的发展