Python实现聊天室全双工通信
学校的作业,用TCPSocket实现聊天室,课程中的只是简单的一对一对话,网上有用IO多路复用select的,有多线程的。
遇到的问题是recv阻塞问题,解决方法是设置客户端连接超时,无消息则捕获timeout异常并pass,继续处理其他连接的缓冲区。(吐槽:python还是把异常作为正常流程处理了,作为一个java基础的开发还是很难接受的),本来已经写完了,用网络测试工具做客户机总是无法断开连接,甚至能继续发消息,后来发现要把窗口叉掉才能断开,那断开按钮还有什么意义,坑啊。
以下代码
服务器:
客户端:
from threading import Thread
from socket import *
import time
tcpClientSocket = None
#接收服务器数据
def recvData():
global tcpClientSocket
while True:
recvData = tcpClientSocket.recv(1024)
if len(recvData)==0:
print(服务器已关闭!)
tcpClientSocket.close()
break
print(recvData)
time.sleep(1)
#发送数据
def sendData():
global tcpClientSocket
while True:
sendData = input("")
tcpClientSocket.send(sendData.encode())
def main():
global tcpClientSocket
tcpClientSocket = 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列表(list(线性表))
