You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:24:08