JS WebSocket无法连接Python Socket,服务器显示已连接的问题求助
问题原因分析
你的后端代码用的是普通TCP Socket,但WebSocket连接需要完成特定的HTTP握手流程才能升级为WebSocket连接,直接用TCP Socket接收请求无法处理WebSocket的握手协议,导致连接失败。
具体问题点
- 浏览器发起WebSocket连接时,首先会发送一个HTTP GET请求(携带
Upgrade: websocket等协议头),要求将连接升级为WebSocket - 你的后端只是简单接收数据并回传,没有按照WebSocket协议要求返回握手响应,浏览器无法完成握手流程,因此判定连接失败
- 服务器日志里的
POST / HTTP/1.1 500属于干扰项,真正的TCP连接是后面的Connected by ('127.0.0.1', 51661),但这个连接没有完成WebSocket握手,所以浏览器最终报错
修复方案
不要用原生TCP Socket实现WebSocket,直接使用Python的WebSocket专用库,比如websockets,以下是完整示例:
第一步:安装依赖
pip install websockets
第二步:编写后端WebSocket服务器代码
import asyncio import websockets import json async def handle_client(websocket): print(f"Connected by {websocket.remote_address}") # 接收前端发送的消息 raw_data = await websocket.recv() message = json.loads(raw_data) print(f"Received message: {message}") # 回传响应消息 await websocket.send(json.dumps({"status": "success", "greeting": f"Hello, {message['name']}"})) async def run_server(): async with websockets.serve(handle_client, "127.0.0.1", 8080): await asyncio.Future() # 保持服务器持续运行 if __name__ == "__main__": asyncio.run(run_server())
前端代码无需修改(保持原有逻辑即可)
let sock = new WebSocket('ws://127.0.0.1:8080/'); sock.addEventListener('error', (event)=>{ console.log(event); }) sock.addEventListener("open", (event) => { sock.send(JSON.stringify({'name':'test'})); console.log('MESSAGE SENT'); }); sock.addEventListener("message", (event) => { console.log("Message from server ", event.data); });
为什么原生TCP Socket无法实现WebSocket?
WebSocket是基于TCP的应用层协议,但有两个关键要求原生TCP不具备:
- 连接建立阶段必须完成HTTP握手:浏览器发送升级请求,服务器返回
101 Switching Protocols响应,并携带协议要求的验证头 - 数据传输阶段必须使用WebSocket帧格式:通信数据会被封装成特定格式的帧,而不是原生的明文数据
原生TCP Socket只会处理字节流的收发,不会处理这些协议层的逻辑,因此无法与浏览器的WebSocket客户端正常通信。
内容的提问来源于stack exchange,提问作者Ilias Elbadaoui
相关产品推荐
相关产品推荐

