学校的作业,用TCPSocket实现聊天室,课程中的只是简单的一对一对话,网上有用IO多路复用select的,有多线程的。

多线程的想过,服务器为每一个客户机开一个线程,很好实现但开销太大,我当初设计的是接收新连接线程和接收新消息并转发线程,存活连接用list保存。

遇到的问题是recv阻塞问题,解决方法是设置客户端连接超时,无消息则捕获timeout异常并pass,继续处理其他连接的缓冲区。(吐槽:python还是把异常作为正常流程处理了,作为一个java基础的开发还是很难接受的),本来已经写完了,用网络测试工具做客户机总是无法断开连接,甚至能继续发消息,后来发现要把窗口叉掉才能断开,那断开按钮还有什么意义,坑啊。

以下代码

服务器:

#coding=utf-8
from threading import Thread
from socket import *
import timetcpSocket = None
aliveConnList = []#接受新连接线程
def acceptConn():global aliveConnListglobal tcpSocketwhile True:newSocket,clientAddr = tcpSocket.accept()print('%s已连接'%(str(clientAddr)))newSocket.settimeout(1)aliveConnList.append((newSocket,clientAddr))#接收新消息线程
def recvData():global aliveConnListwhile True:#遍历缓冲区,有数据输出并转发,没数据超时过for s in aliveConnList:try:print("recving")recvData = s[0].recv(1024)print("received")if len(recvData)>0:#有数据,向其他tcp发送该数据for other in aliveConnList:if other!=s:other[0].send(('recv from %s:%s'%(s[1],recvData)).encode())print('recv from %s:%s'%(s[1],recvData))else:#客户端断开print('%s已断开连接'%(str(s[1])))s[0].close()aliveConnList.remove(s)except timeout:#该连接无数据pass#可怜的cputime.sleep(1)def main():global tcpSockettcpSocket = socket(AF_INET,SOCK_STREAM)address = ('',1234)tcpSocket.bind(address)tcpSocket.listen(5)print("欢迎使用")ta = Thread(target=acceptConn)tr = Thread(target=recvData)ta.start()tr.start()ta.join()tr.join()tcpSocket.close()if __name__ == "__main__":main()

客户端:

from threading import Thread
from socket import *
import timetcpClientSocket = None#接收服务器数据
def recvData():global tcpClientSocketwhile True:recvData = tcpClientSocket.recv(1024)if len(recvData)==0:print('服务器已关闭!')tcpClientSocket.close()break        print(recvData)time.sleep(1)#发送数据
def sendData():global tcpClientSocketwhile True:sendData = input("")tcpClientSocket.send(sendData.encode())def main():global tcpClientSockettcpClientSocket = socket(AF_INET,SOCK_STREAM)serverIP = input("请输入服务器ip: ")serverPort = input("请输入服务器端口号: ")serverAdd = (serverIP,int(serverPort))tcpClientSocket.connect(serverAdd)tr = Thread(target=recvData)ts = Thread(target=sendData)tr.start()ts.start()tr.join()ts.join()tcpClientSocket.close()if __name__ == "__main__":main()

Python实现聊天室全双工通信相关推荐

  1. Python在线聊天室(windows)

    Python在线聊天室(windows) 1.:准备系统参数配置模块 (settings.py) #服务器地址 HOST = 'localhost' #服务器端口 PORT = 9999 #服务器管道 ...

  2. 基于Python的聊天室

    基于Python的聊天室 文章目录 基于Python的聊天室 一.引言 1.1 背景和意义 1.2 系统要实现的功能 1.2.1 用户登录 1.2.2 群发消息 1.2.3 一对一聊天 1.2.4 发 ...

  3. 基于python的聊天室_Python实现文字聊天室

    你是否想过用所学的Python开发一个图形界面的聊天室程序啊? 像这样的: image 如果你想开发这样一个有点怀旧风格的聊天程序,那么可以接着看: 要开发这个聊天程序,你需要具备以下知识点: asy ...

  4. python 实现聊天室

    所用模块 asyncore 官方介绍, 源码 英文捉鸡点 这里  源码中可以看到其实本质上就对 select 以及 socket 的进一步封装 简单说明 Python的asyncore模块提供了以异步 ...

  5. 如何在基于python的聊天室中实现表情接收功能

    注:本聊天室涉及TCP.SNMP协议 发送表情功能要点主要有两部分:表情按钮点击事件.字典存放表情. 表情按钮点击事件:发送表情时,参数是发的表情图标记,发送后将按钮销毁. 本次选用四个表情,每一个表 ...

  6. python qq聊天室

    1. 群聊聊天室 功能: 类似QQ群功能 有人进入聊天室树要输入姓名,姓名不能重复 有人进入聊天室时,其他人会收到通知: xxx 进入聊天室 一个人发消息,其他人会收到: xxx: xxxxxx 有人 ...

  7. Python在线聊天室

    基于Django&Websocket实现在线聊天室 痛点 痛点解决方案 轮询 长轮询 Websocket Django配置Websocket 前端连接Websockt 痛点 服务端(后端)需要 ...

  8. SpringBoot开发网页即时聊天室/IM通信/WebSocket/即时通讯

    现在的java开发基本都是基于springboot,所以我们就基于springboot2环境. 效果展示(基于网页浏览器的,不是桌面程序) 通讯协议: 现在的主流浏览器基本都支持html5标准,所以我 ...

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

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

最新文章

  1. 从用户角度看,DBMS应当提供哪些功能?
  2. quartz 动态添加job_SpringBoot+Quartz实现动态管理定时任务
  3. 等了半个多月的悟空宝终身寿险
  4. Day8 - Python网络编程 Socket编程 --转自金角大王
  5. Web API应用架构设计分析(2)
  6. 博士生录取采用审核制,存在的一些明显问题!
  7. 野生前端的数据结构基础练习(5)——散列
  8. pygame精灵组有哪些方法_利用 pygame 开发一款游戏:「跳跳兔」(六)
  9. 【算法】八皇后问题 Python实现
  10. 【Unity效率优化】资源管理系统Addressable Asset
  11. Spring自定义属性转换器
  12. UE4 粒子特效基础学习 (02-光晕效果制作)
  13. 生成式模型和判别式模型的区别
  14. 稳定好用的短连接生成平台,支持API批量生成
  15. 计算标准累积正态分布_正态分布在用户等级划分的应用
  16. [ZJOI2015] 幻想乡战略游戏——树链剖分
  17. 企业建站选择阿里云服务器配置详细教程
  18. 微量元素可增加宝宝食欲
  19. mysql 5.7 安装配置教程(windows 64位)
  20. 案例分析-金融业网络安全攻防

热门文章

  1. 微服务架构下的配置治理模式
  2. 怎么申请快手服务商?需要哪些条件?有哪些扶持政策?
  3. Glassfish 安装配置
  4. TabLayout 导航
  5. Go语言流程引擎go-activiti
  6. 青柚im安装短信宝短信插件教程
  7. Java-------学生教师管理系统
  8. vim java 编程_你也用Vim写Java代码?
  9. ic_card 驱动程序开发
  10. mac下使用inode客户端上网无法开启互联网共享的解决办法