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

JS WebSocket无法连接自定义Socket服务器问题求助

问题根源:协议不兼容

你搭建的是普通TCP Socket服务器,但JS客户端使用的是WebSocket协议——两者属于完全不同的通信协议,无法直接互通。WebSocket是基于HTTP的升级协议,需要完成特定的握手流程才能建立连接,而你的TCP服务器无法识别WebSocket的握手请求,因此连接失败。


解决方案

方案1:将Python服务器改造为WebSocket服务器

使用Python的websockets库实现兼容WebSocket协议的服务器,这是最直接的解决方式。

步骤1:安装依赖

pip install websockets

步骤2:修改后的服务器代码

import asyncio
import websockets

# 存储在线WebSocket客户端
connected_clients = set()

async def handle_client(websocket):
    # 连接建立时添加客户端
    connected_clients.add(websocket)
    try:
        while True:
            # 发送当前在线人数
            await websocket.send(str(len(connected_clients)))
            await asyncio.sleep(0.5)
    except websockets.exceptions.ConnectionClosed:
        # 连接断开时捕获异常
        pass
    finally:
        # 移除断开的客户端
        connected_clients.remove(websocket)

async def main():
    # 启动WebSocket服务器,监听所有网卡的56123端口
    async with websockets.serve(handle_client, "0.0.0.0", 56123):
        await asyncio.Future()  # 保持服务器持续运行

if __name__ == "__main__":
    asyncio.run(main())

步骤3:调整JS客户端代码

注意:本地测试用ws://协议,线上部署需配置SSL证书后使用wss://

// 根据实际情况替换为服务器地址,本地测试用ws://localhost:56123
const ws = new WebSocket('ws://server.com:56123');

ws.onmessage = (msg) => {
    console.log(`在线用户数: ${msg.data}`);
};

ws.onerror = (err) => {
    console.error('连接错误:', err);
};

ws.onclose = () => {
    console.log('连接已关闭');
};

方案2:用Nginx做协议转换(保留原TCP服务器)

如果不想修改原TCP服务器,可以通过Nginx反向代理,将WebSocket请求转换为TCP连接转发到原服务器。

Nginx配置示例

server {
    listen 56124 ssl;
    # 替换为你的SSL证书路径
    ssl_certificate /path/to/your/cert.pem;
    ssl_certificate_key /path/to/your/key.pem;

    location / {
        proxy_pass http://localhost:56123;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}

调整JS客户端

连接Nginx监听的端口(示例中为56124):

const ws = new WebSocket('wss://server.com:56124');
// 其余逻辑和之前一致

额外说明
  • 原Java/Python的TCP客户端与WebSocket协议不兼容,若要同时支持两种客户端,需:
    1. 开启两个独立端口,分别运行TCP服务器和WebSocket服务器;
    2. 在单服务器中做协议检测,判断首个数据包是否为WebSocket握手请求,再分逻辑处理。
  • 若使用wss://协议,服务器必须配置有效的SSL证书,否则浏览器会拒绝连接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:03:15