Python Websocket备份文件服务器收1条消息后停止响应求助
问题修复方案
1. Python客户端发单条消息后服务端假死修复
你最早版本的连接处理函数逻辑冲突:外层while True死循环和内层async for遍历websocket消息的逻辑重复,async for本身就会持续监听连接直到断开,两层嵌套导致接收流程异常,收一条消息后就卡住。
你后续简化的版本逻辑已经正确,推荐用更简洁的async for写法,同时增加回包逻辑避免客户端超时:
async def handle_connectio(websocket, path): try: async for data in websocket: print(f"<<< {data}") # 可选:给客户端返回接收确认,避免部分客户端等待响应超时 await websocket.send(f"recv success: {data}") except websockets.exceptions.ConnectionClosed: print("连接已正常断开")
注意:不要在协程内直接调用
quit()终止进程,单个连接断开只要退出当前处理函数即可,不会影响其他客户端连接。如果要停止整个服务,需要操作事件循环停止。
2. C++客户端消息无法接收修复
该问题和服务端try逻辑无关,是C++侧的websocket实现问题:
- 如果你C++端直接用原生TCP socket发裸数据,没有完成websocket标准握手、数据帧封装流程,Python的websockets库会直接丢弃无效数据,不会触发接收回调
- 排查建议:
- 确认C++端使用标准websocket库(如Boost.Beast、libwebsockets)实现通信,而非裸TCP连接
- 确认C++端的websocket握手请求成功,没有被服务端主动断开
- 必要时可抓包验证C++端发送的数据包格式符合websocket协议标准
可选方案:切换原生TCP实现
如果只是用于内网备份文件传输,不需要浏览器兼容,原生TCP socket的实现更简单,没有websocket的帧开销,更适合大文件传输场景。
内容的提问来源于stack exchange,提问作者lightshadown
相关产品推荐
相关产品推荐

