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

Python结合socket与threading实现非阻塞接入连接的异常问题

Python Socket多线程服务端代码bug修复

核心问题清单

  • 线程参数传递错误:创建客户端处理线程时,args 参数未按元组格式传入,且误将服务端监听套接字作为参数传给客户端处理方法,没有传入新生成的客户端连接对象c
  • 监听逻辑阻塞主流程:start_server 中直接同步调用accept_connections,accept() 默认是阻塞方法,会导致主线程完全卡住,后续的s.close()永远不会执行
  • 方法调用逻辑错误:accept_connections和client_connect都是类实例方法,直接通过类名调用未传入实例对象,运行时会触发参数不匹配报错
  • 未配置非阻塞模式:监听套接字没有设置非阻塞属性,不符合非阻塞接收连接的需求

修复后完整代码

import threading
import socket
import random

class HighCardServer:
    def __init__(self, address, port, backlog):
        # 初始化属性
        self.address = address
        self.port = port
        self.backlog = backlog
        self.running = False # 新增运行状态控制,方便后续关闭服务

    def start_server(self):
        s = socket.socket()
        # 设置监听套接字非阻塞
        s.setblocking(False)
        s.bind((self.address, self.port))
        s.listen(self.backlog)
        self.running = True
        # 将accept逻辑放到独立线程运行,避免阻塞主线程
        accept_thread = threading.Thread(target=self.accept_connections, args=(s,))
        accept_thread.start()

    def accept_connections(self, server_socket):
        while self.running:
            try:
                c, addr = server_socket.accept()
                print("Connected to", addr)
                # 传入客户端连接对象c,args加逗号保证是元组
                t = threading.Thread(target=self.client_connect, args=(c,))
                t.start()
            except BlockingIOError:
                # 非阻塞模式下没有连接时会抛这个异常,忽略即可继续循环
                continue
        
    def client_connect(self, client_socket):
        # 客户端交互逻辑,执行完后关闭客户端连接
        try:
            # 此处补充具体业务逻辑
            pass
        finally:
            client_socket.close()

额外优化说明

  • 新增了running状态变量,可在需要停止服务时设置为False,优雅终止监听循环
  • 非阻塞模式下捕获BlockingIOError异常,避免没有新连接时程序直接崩溃
  • 客户端处理方法新增了finally块自动关闭客户端套接字,避免资源泄漏

内容的提问来源于stack exchange,提问作者Ana Mayordomo Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 15:27:03