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

Python TCP Socket服务端异常断开及[WinError 10038]错误求助

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...")

其他需要修正的细节

  1. 服务端未回复客户端的问题:你调用users_wanted_action(client_soc, users_wanted_action)时,把函数本身作为第二个参数传进去了,这显然不对。假设users_wanted_action是处理请求并回复客户端的函数,应该传入客户端的请求内容(比如client_msg),这样函数才能生成对应的回复并通过client_soc.send()发送给客户端。

  2. 客户端阻塞问题:你的客户端每次发送请求后都会调用getting_and_decoding_server_message(sock)等待回复,如果服务端没有执行send()操作,客户端会一直阻塞在这里,这也是你觉得“没收到回复”的原因——服务端根本没发回复。

  3. 异常处理优化:在getting_info_from_client_and_decoding里,除了捕获通用Exception,可以针对性处理ConnectionResetError(客户端异常断开)、ConnectionAbortedError等常见Socket异常,避免误判。

小提示

如果后续需要支持多个客户端同时连接,你需要用多线程或异步IO(比如asyncio)来处理每个客户端的连接,不然当前服务端一次只能处理一个客户端。

备注:内容来源于stack exchange,提问作者Oscar17

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 12:39:59