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
相关产品推荐
相关产品推荐

