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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:45:05