Qt websockets 连接到 Pusher 服务

Posted

技术标签:

【中文标题】Qt websockets 连接到 Pusher 服务【英文标题】:Qt websockets to connect to Pusher service 【发布时间】:2014-10-17 06:27:16 【问题描述】:

我有一个 javascript sn-p 连接到我需要转换为 c++ 的推送服务

<script src="//js.pusher.com/2.2/pusher.min.js" type="text/javascript"></script>
<script type="text/javascript">
var pusher = new Pusher("cb65d0a7a72cd94adf1f");
var channel = pusher.subscribe("ticker.155");
channel.bind("message", function(data) 
        //console.log(data);
        var topbuy = data.trade.topbuy;
        var topsell = data.trade.topsell;
        console.log("Buy Price: ", topbuy.price,
                "Buy Quantity:", topbuy.quantity),
        console.log("Sell Price: ", topsell.price,
                "Sell Quantity:", topsell.quantity);
);
</script>

我能够打开连接数据包以了解发生了什么http://i.imgur.com/4iYIdLz.png 但我似乎无法获得连接。

socketclass.cpp

#include "socketclass.h"

socketClass::socketClass(QObject *parent) :
    QObject(parent)



void socketClass::Test()

    socket = new QTcpSocket(this);
    connect(socket,SIGNAL(connected()), this, SLOT(connected()));
    connect(socket,SIGNAL(disconnected()), this, SLOT(disconnected()));
    connect(socket,SIGNAL(readyRead()), this, SLOT(readyRead()));
    connect(socket,SIGNAL(bytesWritten(qint64)), this, SLOT(bytesWritten(qint64)));

    qDebug() << "......Connecting";

    socket->connectToHost("ws.pusherapp.com/app/cb65d0a7a72cd94adf1f?protocol=7&client=js&version=2.2.3&flash=false",80);

    if(!socket->waitForConnected(1000))
    
        qDebug() << "Error:  "  << socket->errorString();
    



void socketClass::connected()

    //meat and potatoes goes here
    qDebug() << "......Connected";
    //socket->write("HEAD / HTTP/1.0\r\n\r\n\r\n");
    socket->event();


void socketClass::disconnected()

    qDebug() << "......Disconnected";


void socketClass::bytesWritten (qint64 bytes)

    qDebug() << "We wrote:   " << bytes;


void socketClass::readyRead()

    qDebug() <<  "Reading..,,";
    qDebug() << socket->readAll();

socketclass.h

#ifndef SOCKETCLASS_H
#define SOCKETCLASS_H
#include <QDebug>
#include <QObject>
#include <QTcpSocket>
#include <QAbstractSocket>

class socketClass : public QObject

    Q_OBJECT
public:
    explicit socketClass(QObject *parent = 0);
    void Test();

signals:


public slots:
    void connected();
    void disconnected();
    void bytesWritten (qint64 bytes);
    void readyRead();

private:
    QTcpSocket *socket;

;

#endif // SOCKETCLASS_H

main.cpp

#include <QCoreApplication>
#include "socketclass.h"

int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);

    socketClass mTest;
    mTest.Test();

    return a.exec();

我应该使用 c++ websockets 来模拟 Javascript 的正确连接参数是什么? 我只是想接收代码数据并将其分配给一个对象或变量。

【问题讨论】:

【参考方案1】:

我的 Qt 体验有点老了,但据我所知,您不会收到信号,因为您没有运行事件循环。您不应该使用waitForConnected 调用,您应该运行a.exec() 并让它负责处理事件。唯一看起来很奇怪的是你打电话给waitForConnected,很可能得到一个错误但仍然打电话给a.exec() 但在那之后不要收到信号(或者您可能在失败后停止应用程序?)。

【讨论】:

我什至无法建立基本连接。我还没有解决错误处理。你能更详细地解释一下你的回答吗? Qt 需要一个线程来调度您连接槽的信号,这就是当您调用a.exec() 时发生的情况,Qt 内部进入一个事件循环并开始泵送事件。在您启动事件循环之前,不会传递任何信号,因此不会调用任何处理程序。这就是为什么建议删除“waitForConnected()”调用并检查进入事件循环时发生的情况的原因。事件 Qt 文档状态为Note: This function may fail randomly on Windows. Consider using the event loop and the connected() signal if your software will run on Windows.

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

使用 JavaScript 将 Websocket 连接到 Qt Fortune Server

Qt websocket,连接到服务器

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

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

将 Qt EchoClient 连接到 https://www.websocket.org/echo.html 时赢得 QAbstractSocket::UnsupportedSocketOperat

消息:无法连接到 Pusher 异常:“Illuminate\Broadcasting\BroadcastException”