Qt websocket,连接到服务器

Posted

技术标签:

【中文标题】Qt websocket,连接到服务器【英文标题】:Qt websocket, connect to server 【发布时间】:2019-02-06 12:51:45 【问题描述】:

我正在尝试连接到“wss://api.huobi.pro/ws”。 连接后,我必须使用消息 ""id":"wanbtc","sub":"market.wanbtc.depth.step0""

订阅频道
    auto ws = new WebSocketSync;
    ws->setIs_display_scan_speed(new bool(false));

    QJsonObject json;
    json["sub"] = "market.wanbtc.depth.step0";
    json["id"] = "wanbtc";

    ws->set_url("wss://api.huobi.pro/ws");
    ws->set_register_message(QJsonDocument(json).toJson(QJsonDocument::Compact));

    ws->open();

代码结果:

[Websocket] Current soket state: QAbstractSocket::ConnectingState
[Websocket] Current soket state: QAbstractSocket::ConnectedState
[Websocket] Connected to server "wss://api.huobi.pro/ws"
[Websocket] Send message to server "\"id\":\"wanbtc\",\"sub\":\"market.wanbtc.depth.step0\""

但是socket之后没有发送任何数据

类似的代码适用于 node.js

const moment = require('moment');
const WebSocket = require('ws');
const pako = require('pako');

const WS_URL = 'wss://api.huobi.pro/ws';


var orderbook = ;

exports.OrderBook = orderbook;

function handle(data) 
    console.log('received', data.ch, 'data.ts', data.ts, 'crawler.ts', moment().format('x'));
    let symbol = data.ch.split('.')[1];
    let channel = data.ch.split('.')[2];
    switch (channel) 
        case 'depth':
            orderbook[symbol] = data.tick;
            //console.log(data.tick);
            break;
    


function subscribe(ws) 
    var symbols = ['wanbtc'];

    for (let symbol of symbols) 
        var message = JSON.stringify(
            "sub": `market.$symbol.depth.step0`,
            "id": `$symbol`
        );
        console.log('send to ws ' + message);
        ws.send(message);
    



function init() 

    var ws = new WebSocket(WS_URL);
    ws.on('open', () => 
        console.log('connect to ' + WS_URL);
        subscribe(ws);
    );
    ws.on('message', (data) => 
        let text = pako.inflate(data, 
            to: 'string'
        );
        let msg = JSON.parse(text);
        if (msg.tick) 
            // console.log(msg);
            handle(msg);
        

    );


init();

可能是什么原因?在 node.js 上工作,而不是在 Qt 上工作。需要寻找 QWebsocket 的替代品吗?

编辑 1: WebSocketSync.cpp

WebSocketSync::WebSocketSync()

    connect(&m_socket, &QWebSocket::connected, this, [=]

        qDebug() << "[Websocket] Connected to server" << m_socket.request().url().toString();

        if (m_is_need_to_register_channel) 

            qDebug() << "[Websocket] Send message to server" << m_register_message;
            m_socket.sendTextMessage(m_register_message);
        

    );

    connect(&m_socket, &QWebSocket::textMessageReceived, this, [=](const QString & message) 
        qDebug() << message;
    );



void WebSocketSync::set_url(const QString &url)

//    qDebug() << "[Websocket] Server url setted:" << url;

    m_url.setUrl(url);


void WebSocketSync::set_register_message(const QString &url)

//    qDebug() << "[Websocket] Register message setted:" << url;

    m_is_need_to_register_channel = true;
    m_register_message = url;


void WebSocketSync::open()

//    qDebug() << "[Websocket] Open url:" << m_url;

    m_socket.open(m_url);

【问题讨论】:

Qt 中没有WebSocketSync 类。看来您使用了其他一些库,或者您的示例不完整。 @KonstantinT。 WebSocketSync 是我对 QWebsocket 类的包装。我添加了代码 【参考方案1】:

原因是服务器发出了二进制数据。我需要使用QWebSocket::binaryMessageReceived 进行此连接。 现在我需要弄清楚如何处理二进制数据 (\x1F\x8B\b\x00\x00)

【讨论】:

以上是关于Qt websocket,连接到服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何在NodeJS中代理websocket连接到其他websockets

Qt websocket,连接到服务器

Qt websockets 连接到 Pusher 服务

Qt5 WebSockets 测试应用程序未连接到测试服务

使用 Echo 客户端示例从 Qt UI 连接到 WebSocket 服务器

WebSocket 连接到“ws://chattestarpit.herokuapp.com/”失败:WebSocket 握手期间出错:意外响应代码:503