Qt網絡編程之QNetworkAccessManager


       注意:這個類的所有函數都是可重入的。
       這個類是從Qt4.4引入的。

詳細描述
      QNetworkAccessManager類允許應用程序發送網絡請求和接收網絡應答。
      Network Access API都是圍繞着一個QNetworkAccessManager對象構造的,這個對象包含着發送請求的一些通用配置和設置。它包含着代理和緩存的配置,以及和這些事物相關的一些信號,並且應答信號可以作為我們檢測一個網絡操作的進度。
       一個QNetworkAccessManager對於一整個Qt應用程序來說已經足夠了!
       一旦一個QNetworkAccessManager對象被創建了,那么應用程序就可以使用它在網絡上發送請求。它提供了一組標准的函數,可以承載網絡請求和一些可選的數據,並且每一個請求返回一個QNetworkReply對象。該返回的對象包含着返回的請求應帶的所有數據。


    一個簡單的從網絡下載的例子可如下完成:
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
 connect(manager, SIGNAL(finished(QNetworkReply*)),
         this, SLOT(replyFinished(QNetworkReply*)));

 manager->get(QNetworkRequest(QUrl("http://qt.nokia.com")));
 
    QNetworkAccessManager有一個異步的API。當上面的replyFinished槽被調用的時候,它帶的參數就是包含有下載的數據
的QNetworkReply對象。

注意:當請求完成的時候,程序員需要在適當的時候刪除QNetworkReply對象。不要在連接到信號finished()的槽函數中直接
刪除掉。你可以使用deleteLater()函數。

注意:QNetworkAccessManager將會把它受到的請求排隊。並行執行的請求數量是依賴於協議的。目前,對於桌面平台的HTTP協議,對於一個主機/端口的組合,可6個請求並行執行。

 

一個更加復雜的例子,假設manager已經存在,代碼如下:
QNetworkRequest request;
 request.setUrl(QUrl("
http://qt.nokia.com"));
 request.setRawHeader("User-Agent", "MyOwnBrowser 1.0");

 QNetworkReply *reply = manager->get(request);
 connect(reply, SIGNAL(readyRead()), this, SLOT(slotReadyRead()));
 connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
         this, SLOT(slotError(QNetworkReply::NetworkError)));
 connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
         this, SLOT(slotSslErrors(QList<QSslError>)));
  
網絡和漫游支持
       在Qt4.7版本中,QNetworkAccessManager有了額外的Bearer ManagementAPI支持,使得QNetworkAccessManager具有了管理管理網絡連接的能力。
      QNetworkAccessManager可以在設備離線的時候啟用網絡接口,並且如果當前進程是最后一個使用網絡的時候,QNetworkAccessManager可以停止網絡接口。漫游在傳輸上是同樣透明的。每一個入隊/掛起的網絡請求可以自動的傳輸到一個新的接入點。
      客戶希望不作出任何改變就可以利用這個特性。實際上他就像把與特定平台相關的網絡連接的代碼從應用程序中
刪除。


成員類型文檔
enum QNetworkAccessManager::NetworkAccessibility
表明是否可以通過網絡管理接入網絡
Constant                                                                      Value                            Description
QNetworkAccessManager::UnknownAccessibility         -1              The network accessibility cannot be determined.
QNetworkAccessManager::NotAccessible                      0              The network is not currently accessible, either because there is currently no network coverage or network access has been explicitly disabled by a call to setNetworkAccessible().
QNetworkAccessManager::Accessible                           1               The network is accessible.

 

enum QNetworkAccessManager::Operation
表明這個對於一個應答的處理過程
Constant                             Value Description
QNetworkAccessManager::HeadOperation   1     retrieve headers operation (created with head())
QNetworkAccessManager::GetOperation       2     retrieve headers and download contents (created with get())
QNetworkAccessManager::PutOperation       3     upload contents operation (created with put())
QNetworkAccessManager::PostOperation   4     send the contents of an HTML form for processing via HTTP POST (created with post())
QNetworkAccessManager::DeleteOperation   5     delete contents operation (created with deleteResource())
QNetworkAccessManager::CustomOperation   6     custom operation (created with sendCustomRequest())

 

屬性文檔
networkAccessible : NetworkAccessibility
這個屬性表明當前是否可以通過網絡管理接入網絡。
    如果網絡不可接入,那么network access manager將不會處理任何新的網絡請求,所有這些請求都會發生錯誤而失敗。
那些以file:// scheme作為URLs的請求仍然會被處理。
    這個屬性的默認值反應了設備的物理狀態。應用程序可以通過如下操作來覆蓋它的值以禁止任何網絡請求。
networkAccessManager->setNetworkAccessible(QNetworkAccessManager::NotAccessible);
    我們可以通過如下調用來再次使能網絡:
networkAccessManager->setNetworkAccessible(QNetworkAccessManager::Accessible);

注意:調用setNetworkAccessible()並不會改變網絡狀態。

 

 

Access functions:
NetworkAccessibility networkAccessible () const
void setNetworkAccessible ( NetworkAccessibility accessible )

Notifier signal:
void networkAccessibleChanged ( QNetworkAccessManager::NetworkAccessibility accessible )


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com