Qt之處理QNetworkAccessManager網路連接逾時

來源:互聯網
上載者:User

標籤:ddc   伺服器   網路   頁面   退出   視頻   pst   思路   erro   

簡述

在網路操作中,經常會由於各種原因引起網路連接逾時,究竟何為網路連接逾時?

網路連接逾時:在程式預設的等待時間內沒有得到伺服器的響應

  • 簡述
  • 逾時原因
  • Qt 中的網路連接逾時

逾時原因

引起網路連接逾時的原因很多,下面,列舉一些常見的原因:

  • 網路斷開,不過經常顯示無法串連
  • 網路阻塞,導致你不能在程式預設等待時間內得到回複資料包
  • 網路不穩定,網路無法完整傳送伺服器資訊
  • 系統問題,系統資源過低,無法為程式提供足夠的資源處理伺服器資訊
  • 裝置不穩定,如網線鬆動、介面沒插好等等
  • 網路註冊時系統繁忙,無法回應
  • 網速過慢,如 使用 BT 多線程下載,線上收看視頻等大量佔用頻寬的軟體 ,若使用共用頻寬還要防範他人惡意佔用頻寬
  • 電腦感染了惡意軟體,電腦病毒,電腦木馬等
Qt 中的網路連接逾時

在 Qt 中,關於 QNetworkAccessManager、QNetworkRequest 和 QNetworkReply,並沒有提供關於設定逾時的方法。這種情況下,我們只能自己去處理了。

解決思路:

  • 使用 QTimer 啟動一個單次定時器,並設定逾時時間。
  • 在事件迴圈退出之後,判斷定時器的狀態,如果是啟用狀態,證明請求已經完成;否則,說明逾時。

來先看一個簡單的例子,擷取 Qt 官網 網頁內容:

QTimer timer;timer.setInterval(30000);  // 設定逾時時間 30 秒timer.setSingleShot(true);// 請求 Qt 官網QNetworkAccessManager manager;QNetworkRequest request;request.setUrl(QUrl("http://qt-project.org"));request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");QNetworkReply *pReply = manager.get(request);QEventLoop loop;connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));connect(pReply, SIGNAL(finished()), &loop, SLOT(quit()));timer.start();loop.exec();  // 啟動事件迴圈if (timer.isActive()) {  // 處理響應    timer.stop();    if (pReply->error() != QNetworkReply::NoError) {        // 錯誤處理        qDebug() << "Error String : " << pReply->errorString();    } else {        QVariant variant = pReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);        int nStatusCode = variant.toInt();        // 根據狀態代碼做進一步資料處理        //QByteArray bytes = pReply->readAll();        qDebug() << "Status Code : " << nStatusCode;    }} else {  // 處理逾時    disconnect(pReply, SIGNAL(finished()), &loop, SLOT(quit()));    pReply->abort();    pReply->deleteLater();    qDebug() << "Timeout";}

首先,定義一個 QTimer,然後設定逾時時間為 30000 毫秒(30 秒)。然後,使用 QNetworkRequest 實現一個簡單的網路請求,通過 QNetworkAccessManager::get() 開始擷取 Qt 官網的 HTML 頁面內容。因為請求過程是非同步,所以通過使用 QEventLoop 啟動一個事件迴圈,並將 QTimer 的 timeout() 訊號以及 QNetworkReply 的 finished() 訊號串連至其 quit() 槽函數,保證在定時器到期之後或者網路響應完成後事件迴圈得到退出,不至於一直處於阻塞狀態。

正如上面所述,事件迴圈退出的時候有兩種情況:

  1. QTimer 30 秒到期,逾時
  2. 網路連接響應完成

所以,當 QTimer::isActive() 啟用的情況下,證明響應完成,還尚未逾時。這時需要先調用 QTimer::stop() 來停止定時器,再對響做進一步處理。否則,進行逾時處理 - QNetworkReply::abort() 立即中止操作並關閉網路連接。

Qt之處理QNetworkAccessManager網路連接逾時

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.