亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

同步需要在發(fā)送請求之后,放置一個QEnentLoop,而異步只需要綁定對應的槽函數(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請求二選一
    QUrl url(urlHead+"exam_start/"+studentId);
    request->setUrl(url);
    manager->get(*request);//發(fā)送get請求

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

槽函數(shù)

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

    QString json = reply->readAll();//這個返回的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);
    // 準備工作 - 初始化一個QNetworkRequest
    QNetworkRequest res6;
     //設置頭 - 瀏覽器
    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);


    // 讀服務器回寫的數(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();
    });

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

相關文章

最新評論