WinError 10057:Python TCP服务器无法接收本地客户端连接问题
问题分析与解决方案
核心错误点
- 错误使用监听套接字收发数据:服务器中
s是监听套接字,仅负责接受新连接,不能直接执行recv操作,必须用accept()返回的conn套接字处理数据交互。 - 代码缩进错误:
fragments.append(chunk)和数据拼接逻辑未包含在while循环内,导致循环结束后才尝试添加数据,此时chunk已为空。 - 字节拼接方式错误:
'b'.join(fragments)是字符串拼接逻辑,但接收的chunk是字节类型,需使用b''.join(fragments)完成字节数组拼接。
修正后的服务器代码
import socket HOST = 'localhost' PORT = 12345 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() print("\n Server is listening on port :", PORT, "\n") conn, addr = s.accept() fragments = [] with conn: print(f"Connected by {addr}") while True: chunk = conn.recv(4096) # 使用已连接的conn套接字接收数据 if not chunk: break fragments.append(chunk) # 将接收的字节块加入列表(缩进在循环内) arr = b''.join(fragments) # 正确拼接字节数组 print(arr[0])
客户端代码优化建议
客户端存在冗余创建套接字的问题,with socket.socket(...) as s已创建套接字,无需重复执行s=socket.socket(),修正后:
import socket HOST = 'localhost' PORT = 12345 transmit = b"your_encoded_data_here" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(transmit)
错误原因说明
WinError 10057的本质是:你试图用未建立连接的监听套接字执行recv操作,监听套接字仅用于接受新连接请求,数据收发必须通过accept()返回的已连接套接字完成。
内容的提问来源于stack exchange,提问作者user460178
相关产品推荐
相关产品推荐

