Qt網絡編程之一

網絡編程目錄

*Qt中有關網絡編程的類
*HTTP和FTP高層網絡操作
*使用QTcpSocket和QTcpServer進行TCP編程
*使用QUdpSocket進行UDP編程
*使用QHostInfo解析主機名
*對於網絡代理的支持
*Bearer Management Support



網絡編程
    QtNetwork模塊提供了我們實現TCP/IP客戶端和服務器端的類。它提供了諸如實現特定應用層協議的QFtp類,代表底層網絡協議的類:QTcpSocket、QTcpServer和QUdpSocket,以及使用普遍協議進行網絡操作的高層次類:QNetworkRequest、QNetworkReply和QNetworkAccessManager。它同樣提供了用於實現bearer management的類:QNetworkConfigure、QNetworkConfigureManager和QNetworkSession。



Qt中用於網絡編程的類
下面的類用於支持Qt的網絡編程




關於HTTP和FTP的高層網絡操作
       Network Access API是常見網絡操作類的集合。該API對使用的特定操作和協議(例如:在HHTP上獲取和上傳數據),並且僅僅暴露一般的類、函數和信號或是高層次的概念。
       網絡請求是由QNetworkRequest類呈現的,該類也作爲一個包含於請求相關信息的容器,例如:任何頭部信息和
使用的加密方式。在一個請求對象被創建的時候,指定的URL就可用來決定該請求所使用的協議。目前對於HHTP、FTP和本地文件的URL都支持下載和上傳。
       網絡操作的協同工作是由QNetworkAccessManagement類實現的。一旦一個請求被創建,該類就用來分發請求和發送信號報告請求處理的進度。manager同樣也用來協同在客戶端使用cookies存儲數據、授權請求和代理的使用。
       網絡請求的應答是由QNetworkReply類來呈現的,當一個請求被分發後它就會由QnetworkAccessManager創建。
QNetworkReply提供的信號可以被用來單獨的檢測每一個應答,或者開發者也可以選擇使用manager的信號來達到這種目的,而放棄使用查詢應答信息的方式。由於QNetworkReply是QIODevice的子類,應答信息可以被同步或者異步處理;例如阻塞或者非阻塞操作。
    每一個應用或庫都可以創建一個或者多個QNetworkAccessManager實例來處理網絡通信。


使用QFtp寫FTP客戶端


        FTP(文件傳輸協議)是一種通常被使用來瀏覽遠程主機目錄和文件傳輸的協議。
FTP使用兩個網絡連接,一個用於傳輸命令一個用於傳輸數據。FTP協議有一個狀態,需要客戶端在傳輸數據之前發送幾個命令。FTP客戶端建立一個連接,並且通過會話保持該連接一直被打開。在每一路會話中可以發生多個傳輸操作。
        QFtp類提供對FTP協議客戶端的支持。它有如下特性:
*非阻塞操作。QFtp是異步的。你可以調度一系列的命令使某一個命令在控制權返回到Qt的事件處理循環後再執行。
*命令ID。每一個命令都有一個唯一的ID,你可以使用該ID跟蹤該命令的執行情況。例如:QFtp針對每一個執行的命    令使用命令ID發送commandStarted()和commandFinished()信號。
*數據傳輸的進度指示。無論處在數據發送的什麼階段,QFtp都發送信號(QFtp::dataTransferProgress(), 
  QNetworkReply::downloadProgress(), and QNetworkReply::uploadProgress())。你可以連接這些信號到
  QProgressBar::setProgress() 或者 QProgressDialog::setProgress()。
*QIODevice支持。該類提供了從QIODevice上下載和上傳數據的支持,額外的基於QByteArray的API。
       這裏有兩種主要使用QFtp的方式。最常用的方法就是保持跟蹤命令ID,並且通過連接到合適的信號獲知每個
命令的執行情況。另外一種方法就是一次調度所有的命令,並且僅僅連接到done()信號,該信號在所有調度的
命令都執行完後才發送。第一種方式需要做更多的工作,但是它給予你對每個命令的執行更大的控制權,並且
允許你依據前一個命令的執行執行結果來初始化後面的命令。該方式也允許你提供更多的反饋信息給用戶。
       FTP示例展示瞭如何編寫一個FTP客戶端。依據低層次的類QTcpSocket和QTcpServer編寫你自己的FTP(或者HTTP)服務器也是有可能的。


使用QTcpSocket和QTcpServer進行TCP編程


       TCP(傳輸控制協議)是被大多數英特網協議(包括HTTP和FTP)使用的底層網絡協議,主要用於數據傳輸。它是可靠的,面向流和面向連接的傳輸協議。它特別適合於連續的數據傳輸。
       QTcpSocket提供了一個TCP的接口。你可以使用QTcpSocket實現標準的網絡協議,例如:POP3、SMTP和NNTP以及自定義協議。
      在數據傳輸之前,必須建立一個到遠程主機和端口的TCP連接。一旦該連接建立了,那麼IP地址和端口號都可以通過QTcpSocket::peerAddress() 和 QTcpSocket::peerPort()獲取。任何時候都可以關閉連接,並且數據傳輸也會立即停止。
       QTcpSocket以異步的方式工作,並且通過發送信號報告狀態變化和錯誤,這一點和QNetworkAccessManager以及QFtp類似。它依賴於事件循環檢測到來的數據,並且自動刷新即將發出去的數據。你可以通過QTcpSocket::write()將數據寫入到套接字中,並且通過QTcpSocket::read()讀取數據。QTcpSocket代表了兩個獨立的數據流:一個是讀數據流,另一個是寫數據流。
       由於QTcpSocket繼承自QIODevice,你可以將它與QTextStream和QDataStream一起使用,當從一QTcpSocket中讀取數據時,你必須通過調用QTcpSocket::bytesAvailable()確保有足夠的數據可讀。
       如果你需要處理進入的TCP連接(例如,在一個服務器程序中),那麼就使用QTcpServer類。通過調用QTcpServer::listen()來建立服務器,並且連接到QTcpServer::newConnection()信號,該信號在每一個客戶端連接後發送。在你自己的槽函數中,使用QTcpServer::nextPendingConnection()來接受該連接請求,並且返回QTcpSocket和客戶端通信。
       儘管大多數的這些函數都是異步工作的,但是也可以以同步方式使用QTcpSocket(例如阻塞)。爲了實現阻塞操作,調用QTcpSocket的waitFor...()函數,這將掛起調用的進程知道信號被髮送。例如:在調用非阻塞的QTcpSocket::connectToHost()函數後,可以調用QTcpSocket::waitForConnected()來阻塞該進程,知道connected()信號被髮送。
       同步的套接字通常使得代碼有一個非常簡單的控制流程。waitFor...()方法最大的弊端就是在waitFor...()函數阻塞的時候事件將得不到處理。如果在GUI線程中使用將導致用戶界面凍結。基於這個原因,我們建議你只在非GUI線程中使用同步套接字。當使用同步套接字時,QTcpSocket不需要任何一個事件循環。
       Fortune Client 和 Fortune Server兩個示例展示瞭如何使用QTcpSocket和QTcpServer來編寫基於TCP客戶端-服務器的應用程序。也可以查看 Blocking Fortune Client示例來學習如何在一個單獨的線程中使用同步QTcpSocket(此時沒有使用事件循環),Threaded Fortune Server是一個多線程的TCP服務器,在每一個活動的客戶端只有一個線程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章