WebSocket无法建立连接:on_open事件失效及ws参数疑问
问题
- 尝试用WebSocket替代REST API,但
on_open事件始终不触发,一段时间后只会收到on_close事件,脚本无报错直接结束 - 不清楚
on_open方法里的ws参数是什么,以及它的定义位置
示例代码
import websocket import threading import _thread import json class SocketConn(websocket.WebSocketApp): def __init__(self, url, params=[]): super().__init__(url=url, on_open=self.on_open) self.params = params self.on_message = lambda ws, msg: self.message(msg) self.on_error = lambda ws, e: print('Error', e) self.on_close = lambda ws: print('Closing') self.run_forever() def on_open(self, ws,): print('Websocket was opened') def run(*args): tradeStr = { "method":"SUBSCRIPTION", "params":self.params } ws.send(json.dumps(tradeStr)) _thread.start_new_thread(run, ()) def message(self, msg): print(msg) threading.Thread(target=SocketConn, args=('wss://wbs.mexc.com/ws',["spot@public.deals.v3.api@BTCUSDT"])).start()
解决方案与解释
一、解决on_open不触发的问题
1. 修复端点与SSL配置
首先确认MEXC的WebSocket端点是否正确,建议替换为官方标准端点(如wss://wbs.mexc.com/ws/v3)。同时添加SSL选项避免证书验证阻碍连接:
# 需先导入ssl模块 import ssl # 修改run_forever调用 self.run_forever(sslopt={"check_hostname": False, "cert_reqs": ssl.CERT_NONE})
2. 增强错误排查
当前错误处理过于简略,修改为详细输出以便定位问题:
self.on_error = lambda ws, e: print(f'错误详情: {type(e).__name__} - {str(e)}')
通过具体错误信息可快速判断是连接超时、DNS失败还是端点不存在等问题。
3. 调整线程逻辑
子类__init__中直接调用run_forever(),同时外层用threading.Thread包裹实例化,会导致线程嵌套冲突。可二选一:
- 去掉外层
threading.Thread,直接执行SocketConn('wss://wbs.mexc.com/ws/v3',["spot@public.deals.v3.api@BTCUSDT"]) - 将
run_forever()移到独立线程中执行,避免重复嵌套
4. 修正订阅格式
MEXC的WebSocket订阅方法名应为SUBSCRIBE而非SUBSCRIPTION,修改订阅消息:
tradeStr = { "method":"SUBSCRIBE", "params":self.params }
二、ws参数的解释
ws是当前的WebSocketApp实例对象,由websocket库在触发on_open事件时自动传入。- 它的定义在websocket库的内部实现中,连接成功建立后,库会创建该实例并传递给
on_open方法,你无需手动定义,只需在方法参数中接收即可。 - 通过这个
ws实例,你可以调用send()发送消息、close()关闭连接等操作,实现对WebSocket连接的控制。
内容的提问来源于stack exchange,提问作者Kucharsky
相关产品推荐
相关产品推荐

