You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python websocket-client库在Mac上无法建立WebSocket连接的问题求助

解决Mac上WebSocket连接无响应的问题

我之前在Mac上也碰到过类似的WebSocket连接没反应还没报错的情况,给你几个排查和解决的方向:

1. 确认Python环境版本匹配

Mac系统默认自带Python 2.x,很容易出现安装依赖和运行脚本用的Python版本不一致的问题:

  • 先检查当前默认Python版本:运行python --versionpython3 --version
  • 确保你用pip3 install websocket-client安装依赖(对应Python3),然后用python3 你的脚本文件名.py来运行,避免版本混淆导致找不到模块或者依赖不生效。

2. 添加错误回调,捕获隐藏的异常

你的脚本里没有设置on_error回调函数,所以连接出错时完全看不到任何提示,这是排查的关键盲区。赶紧加上这个函数:

import ssl
import json
import websocket

socket = 'wss://ws-feed.exchange.coinbase.com'

def on_open(ws):
    print("opened")
    subscribe_message = {
        "type": "subscribe",
        "channels": [{
            "name": "ticker",
            "product_ids": ["BTC-USD"]
        }]
    }
    ws.send(json.dumps(subscribe_message))

def on_message(ws, message):
    print("received a message")
    print(json.loads(message))

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

# 新增错误回调函数
def on_error(ws, error):
    print(f"连接出错:{error}")

ws = websocket.WebSocketApp(socket, on_open=on_open, on_message=on_message, on_close=on_close, on_error=on_error)
ws.run_forever()

运行后如果有错误,比如SSL验证失败、连接超时,就能直接看到具体信息了。

3. 排查网络和防火墙限制

  • 暂时关闭Mac系统防火墙(系统设置 → 网络 → 防火墙),或者检查是否有第三方安全软件(比如杀毒软件)拦截了出站WebSocket连接,测试是否能正常连接。
  • 用curl命令测试WebSocket地址的连通性:
    curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: ws-feed.exchange.coinbase.com" -H "Origin: http://localhost" https://ws-feed.exchange.coinbase.com
    
    如果返回包含HTTP/1.1 101 Switching Protocols的内容,说明网络层面是通的;如果超时或者报错,就是网络/防火墙的问题。

4. 处理SSL证书问题

Mac的根证书存储可能和Windows不同,部分网站的SSL证书可能不被默认信任,导致连接失败:
可以先尝试临时禁用SSL验证(仅用于测试,生产环境不建议),修改run_forever的调用:

ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

如果这样能正常连接,说明是证书问题,你可以更新Mac的系统根证书,或者手动导入对应网站的证书。

5. 检查代理设置

如果你的Mac是通过代理上网的,WebSocket连接需要配置代理参数才能正常连通,修改run_forever

ws.run_forever(
    proxy_type="http",
    http_proxy_host="你的代理IP",
    http_proxy_port=你的代理端口
)

根据你实际的代理类型(http/socks5等)和参数调整。


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

火山引擎 最新活动