Python Socket服务器仅接收第一条消息后停止运行问题求助
问题排查与解决
核心问题原因
服务端代码存在逻辑结构错误:recv() 数据接收逻辑仅在新连接建立(accept() 返回)时执行一次,执行完成后立刻回到循环顶部,重新执行listen()后阻塞在accept()等待新连接,不会持续读取已建立旧连接上的后续数据,因此只能收到客户端发送的第一条消息。
修复后的server.py代码
以下方案适配你当前的单客户端测试场景,可实现同一连接下持续接收消息:
# -*- coding: utf-8 -*- import socket HOST = 'localhost' PORT = 1602 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', PORT)) # listen仅需在服务启动时执行一次,无需放入循环 server_socket.listen(5) print(f"服务端启动,监听端口{PORT}") while True: client, address = server_socket.accept() print(f"{address} 已连接") # 新增内层循环,持续读取当前连接的所有数据 while True: try: response = client.recv(1024) # 客户端正常断开时recv会返回空字节,退出内层循环 if not response: break print(response.decode()) except ConnectionResetError: # 处理客户端异常断开的情况 print(f"{address} 异常断开") break print(f"{address} 连接关闭") client.close()
额外优化建议
- 原代码中将socket实例直接命名为
socket,会覆盖导入的socket模块名,建议修改为server_socket这类无冲突的命名 - 如果需要同时处理多个客户端连接,可以选择多线程或IO多路复用方案,上述单连接循环读取方案足以覆盖你的测试需求
内容的提问来源于stack exchange,提问作者Lechat Marcellin
相关产品推荐
相关产品推荐

