如何使用PySide6通过QWebSocket实现Binance币安数据流主动订阅
问题原因
QWebSocket.open()是异步执行方法,调用后不会立刻完成WebSocket握手连接,你在调用open后立刻执行sendTextMessage时,连接还处于ConnectingState状态,订阅请求没有被实际发送到Binance服务器,因此不会收到任何推送数据。- Binance的WebSocket服务仅会处理已完成握手的连接发送的订阅指令,未建立完成的连接发送的所有数据都会被直接忽略。
解决方法
你需要监听WebSocket的connected信号,在连接成功建立的回调中执行订阅请求,同时建议提前绑定所有信号回调,避免事件漏触发,修正后的代码如下:
import json from PySide6.QtWebSockets import QWebSocket # 初始化WebSocket对象 self.websocket = QWebSocket() self.websocket_base_url = 'wss://stream.binance.com:9443/ws' # 提前绑定所有信号回调 self.websocket.connected.connect(self.on_websocket_connected) self.websocket.textMessageReceived.connect(self.on_message_received) # 最后发起连接请求 self.websocket.open(self.websocket_base_url) # 连接成功回调,此处发送订阅请求 def on_websocket_connected(self): info = { "method": "SUBSCRIBE", "params": [ "btcusdt@aggTrade" ], "id": 1 } self.websocket.sendTextMessage(json.dumps(info)) # 此时打印状态为 PySide6.QtNetwork.QAbstractSocket.SocketState.ConnectedState print(str(self.websocket.state())) # 消息接收回调 def on_message_received(self, msg): print(msg)
额外注意事项
- 所有向WebSocket服务端发送数据的操作,都需要确保在连接处于
ConnectedState状态下执行,不要直接跟在open方法后调用。 - 如果后续需要增加重连逻辑,也可以将所有订阅请求统一放在
connected回调中执行,避免重连后订阅失效。
内容的提问来源于stack exchange,提问作者ygz
相关产品推荐
相关产品推荐

