Qt websocket发送消息并等待响应,然后转到下一个方法

时间:2016-10-28 10:41:34

标签: c++ qt networking

我正在使用Qt websockets。

想要问你,你知道我怎么能进行这种沟通:

例如我有这两种方法,我想向服务器发送消息,而不是等待响应(因为它刷新了data变量)并且比进程myMethod()

client->sendMessageToServer();
myMethod(data);

当然我可以使用信号和插槽...但不知道我怎么能在这里使用它,请参阅:

当我去sendMessageToServer()时,它会向服务器发送消息

void Client::sendMessageToServer(QString &str){

     m_wSocket.sendTextMessage(str);  
}

我应该发出什么?我不知道如何处于等待状态...... QWebSocket中没有这样的插槽,它只是立即转到方法myMethod。 它没有设置数据的位置: 顺便说一下,当我收到消息后,我已经设置了这样的客户端onTextMessageRecieved因为这个:

connect(&m_wSocket, &QWebSocket::textMessageReceived, this, &Client::onTextMessageReceived);

void Client::onTextMessageReceived(QString message)
{
    setData(message);       
}

你有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以在setDataonTextMessageReceived上发出信号并连接到此信号。

void Client::setData(QString message)
{
    //... whatever you do in setData

    emit dataChanged();       
}

在其他课程中你可以做到

connect(client, &Client::dataChanged,this,&<...>::myMethod);

然后打电话

client->sendMessageToServer();
//without the myMethod call

每当setData被调用myMethod时,也会自动调用。{/ p>

Qt并不意味着&#34;等待&#34;大部分的时间。它是事件驱动的。您定义一个事件(或使用一个已存在的事件)并告诉程序在此事件发生时该怎么做。

与&#34;普通&#34;相比,这有点不寻常。编程,但你已经习惯了。

答案 1 :(得分:0)

事实上它是这样的:

首先它处理了myMethod()并且它已经到达了onMessageRecieved,这已经太晚了。我所做的就是删除mymethod()并将其放入插槽中。每当消息传来时我都会发出它。

答案 2 :(得分:0)

我已经实现了一个示例,该示例可以解决我要解决的问题。 在这个问题中,我必须从需要Websocket连接的相机获取图像。然后,为了简化代码,我在回调函数中使用了lambda函数,并且在某个地方学会了一个特殊技巧,该技巧可以创建事件循环,并在退出之前等待信号发生。当您不想处理异步调用时,它非常有用。

代码如下:

QJsonObject Schedule::getImageWithInfo()
{
    QString response;
    QString* responsePtr = &response;

    QWebSocket websocket;
    QWebSocket* websocketPtr = &websocket;

    QObject::connect(websocketPtr, &QWebSocket::connected, [&, websocketPtr, responsePtr]()
    {
        qInfo() << "Schedule::getImageWithInfo: Connected";
        QObject::connect(websocketPtr, &QWebSocket::textMessageReceived, [websocketPtr, responsePtr](const QString& msg)
        {
            qInfo() << "Schedule::getImageWithInfo: message received";
            *responsePtr = msg;
            websocketPtr->close();
        });

        QJsonObject command;
        command.insert("command", "GET_IMAGES_WITH_INFO");
        QJsonDocument doc(command);
        QString strJson(doc.toJson(QJsonDocument::Compact));
        qInfo() << "Schedule::getImageWithInfo: Sending command " << strJson;

        websocketPtr->sendTextMessage(strJson);
    });

    websocket.open(QUrl(urlStr));

    QEventLoop eventLoop;
    QObject::connect(&websocket, SIGNAL(disconnected()), &eventLoop, SLOT(quit()));
    eventLoop.exec();

    QJsonObject responseObj = Utils::QJsonObjectFromString(response);
    return responseObj;
}