Qt Network 模塊提供瞭允許編寫 TCP/IP 客戶端和服務器的類。它提供的低級類,如 QTcpSocket , QTcpServer and QUdpSocket 錶示低級網絡概念,和高級類,如 QNetworkRequest , QNetworkReply and QNetworkAccessManager 能使用公共協議履行網絡操作。它還提供瞭譬如 QNetworkConfiguration、QNetworkConfigurationManager 和 QNetworkSession 能實現承載管理的類。
The Qt Network C++ 類 頁麵包含在 Qt 網絡中的 C++ 類列錶。
網絡訪問 API 是用於履行常見網絡操作的一批類。API 提供的抽象層覆蓋特定操作和所用協議 (例如:通過 HTTP 獲取和張貼數據),並僅為一般 (或高級) 概念暴露類、函數及信號。
網絡請求的錶示是通過 QNetworkRequest 類,還充當與請求關聯的信息 (譬如:任何 Header 頭信息和使用加密) 的通用容器。構造請求對象時指定的 URL 確定請求使用的協議。目前,上傳和下載支持 HTTP、FTP 和本地文件 URL。
網絡操作協調的履行通過 QNetworkAccessManager 類。一旦請求被創建,此類用於分派它並發射信號來報告其進度。管理器還協調使用 Cookie Cookie 在客戶端存儲數據、身份驗證請求及使用代理。
網絡請求響應的錶示通過 QNetworkReply 類;這些被創建由 QNetworkAccessManager 當分派請求時。信號的提供通過 QNetworkReply 可以用於單獨監視每個迴復,或開發者可以選取使用管理器信號代替此目的並丟棄迴復引用。由於 QNetworkReply 是子類化的 QIODevice ,可以同步或異步處理迴復;即:阻塞或非阻塞操作。
每個應用程序或庫均可以創建一個或多個實例化的 QNetworkAccessManager 來處理網絡通信。
TCP (傳輸控製協議) 是用於大多數 Internet 協議 (包括 HTTP 和 FTP) 的低級數據傳輸網絡協議。它是可靠的、麵嚮流的、麵嚮連接的傳輸協議。它尤其適閤於連續數據傳輸。
The QTcpSocket 類為 TCP 提供接口。可以使用 QTcpSocket 以實現標準網絡協議 (譬如:POP3、SMTP 和 NNTP) 及自定義協議。
必須建立到遠程主機和端口的 TCP 連接,在開始傳輸任何數據之前。一旦建立連接,對等方的 IP 地址和端口就是可用的透過 QTcpSocket::peerAddress () 和 QTcpSocket::peerPort ()。在任何時候,對等方都可以關閉連接,然後數據傳輸將立即停止。
QTcpSocket 異步工作並發射信號以報告狀態改變和錯誤,就像 QNetworkAccessManager 。它依賴事件循環來檢測傳入數據並自動刷新傳齣數據。可以把數據寫入套接字使用 QTcpSocket::write (),和讀取數據使用 QTcpSocket::read (). QTcpSocket 錶示 2 個獨立數據流:一個用於讀取,一個用於寫入。
由於 QTcpSocket 繼承 QIODevice ,可以使用它采用 QTextStream and 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 不要求事件循環。
The Fortune 客戶端 and Fortune 服務器 範例展示如何使用 QTcpSocket and QTcpServer 編寫 TCP 客戶端-服務器應用程序。另請參閱 阻塞 Fortune 客戶端 範例瞭解如何使用同步 QTcpSocket 在單獨綫程 (不使用事件循環),和 綫程化 Fortune 服務器 範例瞭解每個活動客戶端采用一綫程的多綫程 TCP 服務器。
UDP (用戶數據報協議) 是輕量、不可靠、麵嚮數據報的無連接協議。可以使用它,當可靠性不重要時。例如,報告每天時間的服務器可以選擇 UDP。若丟失每天時間的數據報,客戶端可以簡單生成另一請求。
The QUdpSocket 類允許您發送和接收 UDP 數據報。它繼承 QAbstractSocket ,因此,它共享大多數 QTcpSocket 接口。主要差異是 QUdpSocket 以數據報的形式傳輸數據,而不是連續數據流。簡而言之,數據報是限製大小的數據包 (通常小於 512 字節),包含數據報發送器和接收器的 IP 地址和端口,除要傳輸的數據外。
QUdpSocket 支持 IPv4 廣播。經常使用廣播來實現網絡探索協議 (譬如:查找哪颱網絡主機擁有最多的空閑硬盤空間)。一颱主機嚮所有其它接收網絡主機廣播數據報。每颱收到請求的主機然後按其當前空閑磁盤空間的數量發送迴復。發起人等待直到收到來自所有主機的迴復,然後可以選擇擁有最多空閑空間的服務器來存儲數據。要廣播數據報,把它簡單發送到特殊地址 QHostAddress::Broadcast (255.255.255.255),或本地網絡的廣播地址。
QUdpSocket::bind () 準備套接字為接受傳入數據報,非常像 QTcpServer::listen () 對於 TCP 服務器。每當一個或多個數據報到達時, QUdpSocket 發射 readyRead() 信號。調用 QUdpSocket::readDatagram () 以讀取數據報。
The 廣播發送器 and 廣播接收器 範例展示如何使用 Qt 編寫 UDP 發送器和 UDP 接收器。
QUdpSocket 還支持多點播送。 多點播送發送器 and 多點播送接收器 範例展示如何使用寫入 UDP 多點播送客戶端。
在建立網絡連接之前, QTcpSocket and QUdpSocket 履行名稱查找,把要連接的主機名轉換成 IP 地址。通常使用 DNS (域名服務) 協議履行此操作。
QHostInfo 提供靜態函數,讓您自己履行這種查找。通過調用 QHostInfo::lookupHost () 采用主機名, QObject 指針及槽簽名, QHostInfo 將履行名稱查找並在結果就緒時援引給定槽。實際查找是在單獨綫程中完成的,利用操作係統自己的名稱查找履行方法。
QHostInfo 還提供靜態函數稱為 QHostInfo::fromName () 以主機名作為自變量並返迴結果。在此情況下,名稱查找在如調用者相同的綫程中履行。此重載對於非 GUI 應用程序或在單獨的非 GUI 綫程中履行名稱查找很有用。(在 GUI 綫程中調用此函數可能導緻用戶界麵被凍結,當函數履行查找時還會阻塞。)
采用 Qt 的網絡通信可以透過代理履行,直接 (或過濾) 本地和遠程連接之間的網絡流量。
錶示單個代理通過 QNetworkProxy 類,用於描述和配置代理連接。代理類型支持運轉於網絡通信的不同級彆,采用 SOCKS 5 支持允許代理低級彆的網絡流量,而 HTTP 和 FTP 代理工作於協議級彆。見 QNetworkProxy::ProxyType 瞭解更多信息。
可以在每個套接字的基礎上 (或為應用程序所有網絡通信) 啓用代理。新近打開的套接字可以使用代理通過調用其 QAbstractSocket::setProxy () 函數在連接之前。可以為所有後續套接字連接啓用應用程序範圍的代理通過使用 QNetworkProxy::setApplicationProxy () 函數。
代理工廠用於創建代理使用策略。 QNetworkProxyFactory 提供基於特定代理類型查詢的代理。查詢本身被編碼在 QNetworkProxyQuery 對象,使能夠基於關鍵準則選擇代理,譬如代理的目的 (TCP、UDP、TCP 服務器、URL 請求)、本地端口、遠程主機和端口及在使用中的協議 (HTTP、FTP 等)。
QNetworkProxyFactory::proxyForQuery () 用於直接查詢工廠。可以實現應用程序範圍的代理策略通過把工廠傳遞給 QNetworkProxyFactory::setApplicationProxyFactory () 和自定義代理策略可以被創建通過子類化 QNetworkProxyFactory ;見類文檔編製瞭解細節。