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
相关产品推荐
相关产品推荐

