Qt websocket发送消息并等待响应,然后再进入下一个方法

Qt websocket send message and wait for response before going to next method

本文关键字:然后 再进入 下一个 方法 响应 等待 websocket 消息 Qt      更新时间:2023-10-16

我正在使用Qt websockets。

我想问你,你知道我该怎么做这个沟通吗?

例如,我有这两个方法,我想发送消息到服务器,然后等待响应(因为它刷新了data变量)和处理myMethod()

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

当然我可以使用信号和插槽…但是不知道在这里怎么用,请看:

当我点击sendMessageToServer() ok它会向服务器发送消息

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);       
}

你知道吗?

您可以在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也会被自动调用。

Qt并不意味着大多数时候都是"等待"的。它是事件驱动的。您定义一个事件(或使用一个已经存在的事件),并告诉程序在该事件发生时该做什么。

与"正常"编程相比,这有点不寻常,但你会习惯的。

我已经实现了一个例子,就像我正在解决的问题一样。在这个问题中,我必须从需要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;
}

事实是这样的:

它首先处理myMethod(),然后到达onmessagerreceived,这太迟了。我所做的就是删除mymethod()并将其放入槽中。我让它发出每当消息来

相关文章: