You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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不具备:

  1. 连接建立阶段必须完成HTTP握手:浏览器发送升级请求,服务器返回101 Switching Protocols响应,并携带协议要求的验证头
  2. 数据传输阶段必须使用WebSocket帧格式:通信数据会被封装成特定格式的帧,而不是原生的明文数据

原生TCP Socket只会处理字节流的收发,不会处理这些协议层的逻辑,因此无法与浏览器的WebSocket客户端正常通信。

内容的提问来源于stack exchange,提问作者Ilias Elbadaoui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:57:02