Python、Node.js、Go 的 WebSocket 代理配置示例
Python、Node.js、Go 的 WebSocket 代理配置示例,提供三种语言的认证、握手、超时和断线排查方法。
WebSocket 代理配置要同时满足代理协议、认证、Upgrade 握手和长连接超时。下面先给出三种语言的最小结构,真实主机、端口和密码请从代理 IP 服务商后台读取。
三种语言的 WebSocket 代理配置差异
三种语言的库在代理认证、超时和错误输出上不同。先确定使用的库和版本,再分别运行示例,不要把一种语言的参数名直接复制到另一种库。
| 语言 | 示例库 | 代理配置位置 | 主要错误入口 |
|---|---|---|---|
| Python | websocket-client | create_connection 参数 | 连接异常 |
| Node.js | ws + Agent | WebSocket 的 agent | error 事件 |
| Go | WebSocket Dialer | Dialer.Proxy | Dial 返回值 |
Python、Node.js、Go 配置示例
Python
安装示例依赖:pip install websocket-client。运行成功时应完成握手并收到测试消息;参数名称需按当前库版本复核。
```python
from websocket import create_connection
ws = create_connection(
'wss://echo.example.com',
http_proxy_host='HOST',
http_proxy_port=PORT,
http_proxy_auth=('USER', 'PASSWORD'),
timeout=15,
)
ws.send('hello')
print(ws.recv())
ws.close()
```
Node.js
安装示例依赖:npm install ws https-proxy-agent。除了监听 open,还应监听 error、关闭代码和握手异常。
```js
import WebSocket from 'ws';
import { HttpsProxyAgent } from 'https-proxy-agent';
const agent = new HttpsProxyAgent('http://USER:PASSWORD@HOST:PORT');
const ws = new WebSocket('wss://echo.example.com', { agent, handshakeTimeout: 15000 });
ws.on('open', () => ws.send('hello'));
ws.on('message', (data) => console.log('message', data.toString()));
ws.on('error', console.error);
ws.on('close', (code, reason) => console.log('close', code, reason.toString()));
```
Go
示例使用 WebSocket Dialer;安装和导入路径应以项目选用的库为准。连接失败时同时记录 Dial 错误和服务端返回状态。
```go
d := *websocket.DefaultDialer
d.Proxy = http.ProxyURL(proxyURL)
d.HandshakeTimeout = 15 * time.Second
conn, _, err := d.Dial("wss://echo.example.com", nil)
if err != nil { log.Fatal(err) }
defer conn.Close()
if err := conn.WriteMessage(websocket.TextMessage, []byte("hello")); err != nil { log.Fatal(err) }
_, msg, err := conn.ReadMessage()
if err != nil { log.Fatal(err) }
log.Printf("message=%s", msg)
```
三种实现都要先用同一代理参数验证普通 HTTPS 请求,再验证 WebSocket 握手,最后测试长连接和断线重连。
三种语言如何验证代理、握手和断线
三个示例都必须完成同一组验收:发送测试消息、接收消息、设置超时、记录 error/close 和关闭码,再安全关闭连接。echo.example.com 只是占位符,请替换为自有或本地启动的回显服务。
- 407:代理认证、端口或协议错误。
- 握手失败:检查目标 URL、Upgrade、TLS 和 SNI。
- 连接立即关闭:检查服务端策略、读取超时和心跳。
- 连接重置/超时:降低并发,固定代理 IP,分别查看客户端和目标服务日志。
常见错误在不同语言中如何表现
Python 重点看库抛出的连接异常,Node.js 重点看 error 和握手响应,Go 重点看 Dial 返回的 HTTP 状态和错误;三者都要先排除代理认证和目标服务问题。
官方文档
三个示例依赖的库、代理支持方式和参数名称可能随版本变化:
- Python websocket-client:核对代理参数、异常和连接选项。
- Node.js ws:核对 Agent、事件和握手行为。
- Gorilla WebSocket:核对 Dialer、代理函数和关闭处理。
- WebSocket 协议 RFC 6455:了解握手、控制帧和关闭代码。
FAQ
三种语言都能使用同一代理 IP 吗?
可以复用同一组代理参数,但每个库支持的协议和认证字段不同,必须按库文档配置并单独验证。
三种语言应该分别查看什么错误信息?
Python 查看连接异常,Node.js 查看 error、握手响应和关闭事件,Go 查看 Dial 错误、HTTP 状态和关闭代码。
三种语言都应按普通 HTTPS → 101 握手 → 消息收发 → 连接保持 → 断线重连的顺序测试。需要先确认代理参数时,可参考代理设置帮助。
