Python多线程Socket聊天程序仅支持单连接、第二客户端消息无法接收问题
问题根因
- 线程创建参数错误:
threading.Thread(target=txtsocket.server())写法中直接执行了server()方法,属于同步调用而非传入函数对象,第一个server()运行后会直接阻塞在连接接收步骤,后续线程根本不会被创建 - 服务端逻辑结构错误:不应该每个线程都执行监听、接收连接的逻辑,正确结构是:主线程仅执行一次端口监听,之后循环调用
accept接收新连接,每收到一个新连接再单独开启子线程处理该连接的消息收发 - 连接未被取出处理:第二个客户端发起连接时,内核会完成TCP握手并将连接存入全连接队列,因此客户端侧会显示连接成功,但服务端一直没有调用
accept取出该连接,自然无法收到第二个客户端发送的消息
修复后代码
服务端代码
import socket import threading class TxtSocket: def __init__(self, host="127.0.0.1" , port=5555): self.host = host self.port = port self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.s.bind((self.host, self.port)) print("Socket was created") # 单独抽取客户端消息处理逻辑,每个连接对应一个子线程执行该方法 def handle_client(self, conn, addr): print(f"{addr} is now connected.") while True: try: data = conn.recv(1024).decode("utf8") print(data) if not data: conn.close() print(f"{addr} disconnected") break except: conn.close() print(f"{addr} disconnected abnormally") break def server(self): self.s.listen() print("Server is listening") # 主线程循环接收新连接 while True: conn, addr = self.s.accept() # 每收到一个新连接,开启子线程处理其消息 t = threading.Thread(target=self.handle_client, args=(conn, addr)) t.start() if __name__ == "__main__": txtsocket = TxtSocket() txtsocket.server()
客户端代码(无需修改,可直接使用)
import socket def Text(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("127.0.0.1", 5555)) print("Connected") while True: message = input("Deine Nachricht: ") message = message.encode("utf8") s.send(message) Text()
内容的提问来源于stack exchange,提问作者Tobias Putz
相关产品推荐
相关产品推荐

