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

WebSocket客户端代理配置:实现服务器消息经443端口转发至客户端

WebSocket连接失败(Errno 111)的两种解决方案

问题背景

使用websocket-client库的run_forever方法连接远程WSS服务器时,持续出现[Errno 111] Connection refused错误,ws.sock对象为None,连接失败后反复重连。经排查,推测是服务器尝试回连客户端的高端口被限制,仅80、443等少数端口可正常访问。


方案一:通过443端口代理转发服务器消息

核心思路

部署监听443端口的代理服务,让服务器将消息发送至该代理,再由代理中转给客户端;同时客户端通过此代理与服务器建立WebSocket连接,实现端口统一转发。

客户端代码配置代理

在run_forever方法中传入代理参数,指定443端口的代理服务:

import websocket

def on_message(ws, message):
    print(message)

def on_error(ws, error):
    print(error)

def on_close(ws):
    print("Connection closed")

def on_open(ws):
    print("Connection opened")

if __name__ == "__main__":
    # 配置443端口的代理信息
    proxy_host = "your-proxy-domain"
    proxy_port = 443
    proxy_auth = ("proxy-username", "proxy-password")  # 按需添加认证

    ws = websocket.WebSocketApp(
        "wss://your-target-server",
        on_open=on_open,
        on_message=on_message,
        on_error=on_error,
        on_close=on_close
    )

    # 启动连接时传入代理配置
    ws.run_forever(
        http_proxy_host=proxy_host,
        http_proxy_port=proxy_port,
        http_proxy_auth=proxy_auth
    )

代理服务配置示例(Nginx)

代理需支持WebSocket转发,以Nginx为例:

server {
    listen 443 ssl;
    server_name your-proxy-domain;

    ssl_certificate /path/to/ssl-cert.pem;
    ssl_certificate_key /path/to/ssl-key.pem;

    location / {
        proxy_pass wss://your-target-server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}

方案二:告知服务器仅通过443端口回连

核心思路

在WebSocket握手或连接初始化阶段,客户端向服务器传递自定义标识,明确要求服务器后续回连仅使用443端口。此方案需服务器端配合支持该逻辑。

客户端传递端口指令

方式1:连接建立后发送消息告知

import websocket

def on_open(ws):
    # 连接成功后发送端口指定指令
    ws.send('{"cmd": "set_reconnect_port", "port": 443}')

def on_message(ws, message):
    print(message)

if __name__ == "__main__":
    ws = websocket.WebSocketApp(
        "wss://your-target-server",
        on_open=on_open,
        on_message=on_message
    )
    ws.run_forever()

方式2:握手阶段通过自定义请求头传递

import websocket

def on_message(ws, message):
    print(message)

if __name__ == "__main__":
    # 握手时添加自定义头告知服务器回连端口
    ws = websocket.WebSocketApp(
        "wss://your-target-server",
        header={"X-Reconnect-Port": "443"},
        on_message=on_message
    )
    ws.run_forever()

服务器端配合逻辑

服务器需解析客户端传递的端口参数,后续发起回连请求时强制使用443端口,具体实现需根据服务器的技术栈(如Node.js、Python等)调整。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:50:25