Python TCP Socket服务端异常断开及[WinError 10038]错误求助
刚接触Python Socket确实容易踩这些基础坑,我帮你梳理下问题根源和解决办法:
核心问题:服务端误用监听Socket进行数据收发
TCP服务端的工作流程是有明确步骤的:创建监听Socket → 绑定地址端口 → 开始监听 → 接受客户端连接(得到真正用于通信的Socket) → 用通信Socket收发数据。
你的代码里,creating_server_TCP_socket()应该已经完成了创建、绑定、监听的操作,但你直接把这个监听Socket传给了getting_info_from_client_and_decoding去调用recv()——这完全错误!监听Socket的作用只是等待客户端连接请求,根本不能用来收发数据,这就是你遇到[WinError 10038]的直接原因:操作系统告诉你“你在一个不是通信Socket的对象上执行了收发操作”。
修正后的服务端核心代码
我帮你调整了main()函数的逻辑,先获取真正的客户端通信Socket再进行数据交互:
def main(): # 创建并配置监听Socket(你的creating_server_TCP_socket应该做了bind和listen) listen_soc = creating_server_TCP_socket() print("Server is waiting for client connections...") # 接受客户端连接,得到用于通信的socket和客户端地址 client_soc, client_addr = listen_soc.accept() print(f"Connected to client: {client_addr}") while True: client_msg = getting_info_from_client_and_decoding(client_soc) if client_msg is None: print(CLIENTS_DISCONNECTING) break else: # 解析用户请求(你的协议逻辑) users_choice = client_msg[:5] users_wanted_action = POSSIBLE_ACTIONS.get(int(users_choice)) if users_wanted_action: # 注意这里参数传错了!应该传通信socket和请求内容,不是函数本身 users_wanted_action(client_soc, client_msg) else: print("Received invalid action code from client") # 先关闭客户端通信socket,再关闭监听socket client_soc.close() listen_soc.close() print("server shut down...")
其他需要修正的细节
服务端未回复客户端的问题:你调用
users_wanted_action(client_soc, users_wanted_action)时,把函数本身作为第二个参数传进去了,这显然不对。假设users_wanted_action是处理请求并回复客户端的函数,应该传入客户端的请求内容(比如client_msg),这样函数才能生成对应的回复并通过client_soc.send()发送给客户端。客户端阻塞问题:你的客户端每次发送请求后都会调用
getting_and_decoding_server_message(sock)等待回复,如果服务端没有执行send()操作,客户端会一直阻塞在这里,这也是你觉得“没收到回复”的原因——服务端根本没发回复。异常处理优化:在
getting_info_from_client_and_decoding里,除了捕获通用Exception,可以针对性处理ConnectionResetError(客户端异常断开)、ConnectionAbortedError等常见Socket异常,避免误判。
小提示
如果后续需要支持多个客户端同时连接,你需要用多线程或异步IO(比如asyncio)来处理每个客户端的连接,不然当前服务端一次只能处理一个客户端。
备注:内容来源于stack exchange,提问作者Oscar17

