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

Node.js中能否通过不同Socks5代理创建多个WebSocket连接?

实现多代理(不同Socks5)的WebSocket客户端连接

核心逻辑很简单:WebSocket的底层是TCP连接,只要让TCP连接先走指定的Socks5代理,就能实现带代理的WebSocket客户端连接。下面用Python给出具体实现方案,其他语言思路类似。

实现步骤(Python)

  1. 安装依赖库
    pip install websockets python-socks
    
  2. 编写代码,为每个WebSocket连接绑定独立的Socks5代理
    import asyncio
    import websockets
    from python_socks import ProxyType, ProxyError, parse_proxy_url
    
    async def proxied_ws_session(proxy_url, target_ws_url):
        # 解析代理配置(支持带认证和不带认证的Socks5)
        proxy_info = parse_proxy_url(proxy_url)
        proxy_type, proxy_host, proxy_port, proxy_user, proxy_pass = proxy_info
    
        # 先通过Socks5代理建立TCP连接
        try:
            # 初始化代理连接器
            connector = python_socks.asyncio.Socks5Connector(
                proxy_host=proxy_host,
                proxy_port=proxy_port,
                username=proxy_user,
                password=proxy_pass
            )
            # 解析目标WebSocket的主机和端口
            target_host = target_ws_url.split('://')[1].split('/')[0].split(':')[0]
            target_port = int(target_ws_url.split('://')[1].split('/')[0].split(':')[1]) if ':' in target_ws_url.split('://')[1] else 80
            # 建立代理TCP连接
            sock, _ = await asyncio.get_event_loop().create_connection(connector, target_host, target_port)
        except ProxyError as e:
            print(f"代理 {proxy_url} 连接失败: {e}")
            return
    
        # 基于代理TCP连接创建WebSocket会话
        try:
            async with websockets.connect(target_ws_url, sock=sock) as ws:
                # 示例:发送消息并接收响应
                await ws.send(f"来自代理 {proxy_url} 的测试消息")
                resp = await ws.recv()
                print(f"代理 {proxy_url} 收到响应: {resp}")
        except Exception as e:
            print(f"WebSocket会话出错(代理 {proxy_url}): {e}")
        finally:
            sock.close()
    
    async def main():
        # 配置多个不同的Socks5代理
        proxy_list = [
            "socks5://user1:pass1@proxy1.example.com:1080",
            "socks5://user2:pass2@proxy2.example.com:1080",
            "socks5://proxy3.example.com:1080"  # 无认证代理
        ]
        target_ws = "ws://your-server.com/ws-endpoint"
    
        # 并发启动多个代理WebSocket连接
        tasks = [proxied_ws_session(proxy, target_ws) for proxy in proxy_list]
        await asyncio.gather(*tasks)
    
    if __name__ == "__main__":
        asyncio.run(main())
    

关键说明

  • 本质是分离TCP连接和WebSocket握手:先通过Socks5代理建立底层TCP连接,再把这个连接交给WebSocket库处理上层协议。
  • 其他语言实现思路一致:比如Node.js可以用ws库搭配socks-proxy-agent,创建带代理的Agent后传给WebSocket构造函数;Go可以用gorilla/websocket配合socks库自定义Dialer。
  • 务必添加异常处理:代理连接失败、WebSocket断开、超时等情况都需要捕获处理,避免单个连接异常影响其他会话。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:37:36