WebSocket客户端无法接收服务器消息(握手正常、服务器可收消息)
问题解决方案
1. 修复服务器消息发送逻辑
你的服务器代码存在核心逻辑错误:await websocket.send(...) 被放在了async for message in websocket循环的外部。这个循环会持续监听客户端发来的消息,直到连接关闭,导致send语句永远无法执行。需要将发送逻辑移到循环内部,在处理完客户端的初始"01"类型消息后立即触发:
修改后的服务器handler函数:
async def handler(websocket, path) : current = None print("handling something") try : async for message in websocket : parsedClientMessage = json.loads(message) print(parsedClientMessage) if parsedClientMessage["type"] == "01" : parsedClientData = parsedClientMessage['message'] current = parsedClientData['username'] if isinstance(parsedClientData, dict) and parsedClientData['username'] in Read(storage) else id(websocket) if current not in clients : clients[current] = {} clients[current][id(websocket)] = websocket # 处理完客户端初始消息后立即发送欢迎消息 await websocket.send(json.dumps(["connect", "Welcome to TerminalSaturn!", id(websocket)])) except Exception as e : print(e) finally: print(f"closed connection") if current in clients : if len(clients[current]) == 1 : del clients[current] else : del clients[current][id(websocket)]
2. 修复消息格式不匹配问题
服务器直接发送Python列表,但WebSocket要求传输字符串/二进制数据,客户端会用JSON.parse解析消息,因此必须用json.dumps()将列表转为JSON字符串,否则客户端会解析失败,无法识别消息。
3. 验证家用服务器的网络配置
- 确认路由器端口转发规则:将外部1111端口正确转发至服务器内部1111端口(WSS未使用默认443端口,需确保端口一致)
- 若使用Nginx反向代理WebSocket,需添加WebSocket专属配置,避免Nginx主动断开连接:
location / { proxy_pass https://localhost:1111; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; }
关于1001错误码的说明
received 1001 (going away)是正常行为,当页面刷新或关闭时,客户端会主动发送断开连接的帧,服务器收到该帧属于预期流程,与消息接收异常无关。
内容的提问来源于stack exchange,提问作者user26948662
相关产品推荐
相关产品推荐

