Python多进程Socket客户端无法连接服务端无报错问题求助
问题根因
- 你使用了
socket.connect_ex()方法但未校验返回值:该方法连接失败时仅返回错误码(如10061代表端口未开放、连接被拒),不会抛出异常,因此你看不到任何连接报错 - Jupyter Notebook环境下multiprocessing子进程的输出默认不会重定向到主内核的输出单元格:就算子进程内部有报错、有打印内容,你在当前Notebook页面也无法看到
- Windows系统下multiprocessing默认使用
spawn启动方式:直接在Notebook顶层写进程启动代码,会导致子进程导入模块时重复执行代码,最终子进程根本没有正常运行client函数 - 也可能是启动顺序错误:未先运行服务端Notebook代码,就启动了客户端进程,连接失败后无提示
- 端口被占用:之前运行的服务端未正常退出,占用了50000端口,新连接无法建立
解决步骤
- 添加连接结果校验:要么替换为普通
connect()方法捕获异常,要么判断connect_ex()的返回值,拿到连接错误信息 - 适配Jupyter下multiprocessing运行逻辑:添加
if __name__ == '__main__'判断包裹进程启动代码,避免spawn模式下子进程重复执行启动逻辑 - 优先用脚本运行排查问题:如果在Jupyter里始终看不到子进程输出,可以把代码存为
.py文件运行,脚本中子进程的输出会直接打印到控制台,更容易排查 - 严格保证启动顺序:先运行服务端代码,看到
waiting for client输出后,再启动客户端多进程代码
修正后的多进程客户端代码
import socket import multiprocessing HOST = '127.0.0.1' PORT = 50000 def client(): data = [] s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 新增连接校验逻辑 ret = s.connect_ex((HOST, PORT)) if ret != 0: print(f"连接服务端失败,错误码:{ret}") return print("成功连接到服务端") while True: byte_message = s.recv(1024) # 新增服务端断开连接的处理逻辑 if not byte_message: print("服务端主动断开连接") s.close() break string_message = byte_message.decode('utf8') header, time, data = string_message.split(' ') if header == 'close': s.shutdown(socket.SHUT_RDWR) s.close() print('client connection shut down') break elif header == '<<': print(time,float(data)) if __name__ == '__main__': # 显式指定启动方式,避免Windows环境兼容性问题 multiprocessing.set_start_method('spawn', force=True) client_process = multiprocessing.Process(target=client) client_process.start() # 等待子进程运行结束,方便捕获输出 client_process.join()
内容的提问来源于stack exchange,提问作者chubaka
相关产品推荐
相关产品推荐

