欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解QT使用http通信的同步和異步

 更新時(shí)間:2023年12月21日 10:55:34   作者:Acnidouwo  
在Qt與Http通信的時(shí)候,會(huì)根據(jù)不同的情況使用同步或者異步的方式進(jìn)行數(shù)據(jù)請(qǐng)求,下面我們就來深入了解一下http通信的同步和異步的相關(guān)知識(shí),感興趣的小伙伴可以了解下

在Qt與Http通信的時(shí)候,會(huì)根據(jù)不同的情況使用同步或者異步的方式進(jìn)行數(shù)據(jù)請(qǐng)求。

同步,即發(fā)送Http請(qǐng)求之后,會(huì)一直等待服務(wù)器返回的數(shù)據(jù),接收到數(shù)據(jù)之前,程序一直阻塞。

異步,即發(fā)送Http請(qǐng)求之后,程序可以繼續(xù)往下執(zhí)行,接收到服務(wù)器返回的數(shù)據(jù)時(shí)自動(dòng)調(diào)用其對(duì)應(yīng)的槽函數(shù)處理數(shù)據(jù)。

同步需要在發(fā)送請(qǐng)求之后,放置一個(gè)QEnentLoop,而異步只需要綁定對(duì)應(yīng)的槽函數(shù)即可。

同步Demo:

	QUrl url(myurl);
    QNetworkReply *reply = quitmanager->get(QNetworkRequest(QUrl(url)));
    QEventLoop eventLoop;
    connect(quitmanager, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit()));
    eventLoop.exec();       //block until finish

    //reply->readall()
    reply->deleteLater();
    reply = nullptr;

    return true;

異步Demo:

    QNetworkAccessManager *manager = new QNetworkAccessManager;
    QNetworkRequest *request = new QNetworkRequest;
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(finishedSlot(QNetworkReply*)));//綁定槽函數(shù)
    //get  post請(qǐng)求二選一
    QUrl url(urlHead+"exam_start/"+studentId);
    request->setUrl(url);
    manager->get(*request);//發(fā)送get請(qǐng)求

????QByteArray postData = document.toJson(QJsonDocument::Compact);
    request->setUrl(url);
    request->setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
    manager->post(*request, postData);//發(fā)送post請(qǐng)求

槽函數(shù)

void MainWindow::finishedSlot(QNetworkReply *reply)
{
    qDebug() << "進(jìn)入函數(shù): " <<  __FUNCTION__;

    QString json = reply->readAll();//這個(gè)返回的JSON包所攜帶的所有信息
    QJsonParseError jsonerror;
    QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8(), &jsonerror);

???????    if (!doc.isNull() && jsonerror.error == QJsonParseError::NoError)
    {
        QJsonObject object = doc.object();
        if(object.contains("type"))
        {
            switch (object.value("type").toInt())
            {
                case 1:parseLogJason(object);break;
                case 2:parseParameterJason(object);break;
                case 3:parseExamStartJason(object);break;
                case 4:parseExamEndJason(object);break;
                default:return;
            }
        }
    }
}

異步也可以將槽函數(shù)寫在函數(shù)內(nèi) 依然是異步

     QNetworkAccessManager* manager6 = new QNetworkAccessManager(this);
    // 準(zhǔn)備工作 - 初始化一個(gè)QNetworkRequest
    QNetworkRequest res6;
     //設(shè)置頭 - 瀏覽器
    res6.setHeader(QNetworkRequest::UserAgentHeader,
                  "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36");
    res6.setUrl(QUrl("http://" + IP + "/version"));
    QNetworkReply* reply6 = manager6->get(res6);
    reply6->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    reply6->attribute(QNetworkRequest::RedirectionTargetAttribute);


    // 讀服務(wù)器回寫的數(shù)據(jù)
    connect(reply6, &QNetworkReply::readyRead, this, [=]()
    {
        //QVariant str = reply6->header(QNetworkRequest::LocationHeader);
        QByteArray data = reply6->readAll();
        //qDebug() << "version  "<< data ;
        QString str = QString(data);
        int pos = str.indexOf('-');
        version[node_id] =  str.mid(pos + 3, 2) + "."+ str.mid(0, pos ) ;
        reply6->abort();
        reply6->close();
        reply6->deleteLater();
        manager6->deleteLater();
    });

到此這篇關(guān)于詳解QT使用http通信的同步和異步的文章就介紹到這了,更多相關(guān)QT http通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談C++中各種不同意義的new和delete的使用

    淺談C++中各種不同意義的new和delete的使用

    本文主要介紹了淺談C++中各種不同意義的new和delete的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • c語言數(shù)據(jù)結(jié)構(gòu)與算法之順序表的定義實(shí)現(xiàn)詳解

    c語言數(shù)據(jù)結(jié)構(gòu)與算法之順序表的定義實(shí)現(xiàn)詳解

    這篇文章主要介紹了c語言數(shù)據(jù)結(jié)構(gòu)與算法之順序表的定義實(shí)現(xiàn)詳解,用順序存儲(chǔ)的方式實(shí)現(xiàn)線性表順序存儲(chǔ),把邏輯上相鄰的元素存儲(chǔ)在物理位置上也相鄰的存儲(chǔ)單元中,元素之間的關(guān)系由存儲(chǔ)單元的鄰接關(guān)系來體現(xiàn),需要的朋友可以參考下
    2023-08-08
  • C++ 智能指針代碼解析

    C++ 智能指針代碼解析

    這篇文章主要介紹了c++ 智能指針基礎(chǔ)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下,希望能給你帶來幫助
    2021-10-10
  • 帶你了解C++中vector的用法

    帶你了解C++中vector的用法

    大家好,本篇文章主要講的是帶你了解C++中vector的用法,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C語言const的4種用法實(shí)例

    C語言const的4種用法實(shí)例

    C語言中const用于禁止修改數(shù)組元素、指針內(nèi)容或基本變量,修飾位置不同,本文就來介紹一下C語言const的4種用法實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-09-09
  • 詳解C++ STL模擬實(shí)現(xiàn)forward_list

    詳解C++ STL模擬實(shí)現(xiàn)forward_list

    forward_list是C++ 11新增的容器,它支持從容器中的任何位置快速插入和移除元素的容器,不支持快速隨機(jī)訪問。本文將模擬實(shí)現(xiàn)forward_list,感興趣的可以了解一下
    2023-01-01
  • C++vector自定義大小方式

    C++vector自定義大小方式

    這篇文章主要介紹了C++vector自定義大小方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • C++回溯算法中組合的相關(guān)問題分析

    C++回溯算法中組合的相關(guān)問題分析

    回溯算法并不是什么高效的算法,因?yàn)楸举|(zhì)上時(shí)去遍歷所有元素,找出所有可能,然后選出需要的答案。那為什么還要回溯法,簡(jiǎn)單來說,不是所有的問題都能用什么巧妙的方法來解決的
    2023-03-03
  • C語言運(yùn)算符的重載詳解

    C語言運(yùn)算符的重載詳解

    這篇文章主要為大家詳細(xì)介紹C語言運(yùn)算符的重載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • OpenCV圖像旋轉(zhuǎn)Rotate的詳細(xì)介紹

    OpenCV圖像旋轉(zhuǎn)Rotate的詳細(xì)介紹

    這篇文章主要介紹了OpenCV圖像旋轉(zhuǎn)Rotate,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評(píng)論