The QtNetwork module offers classes that allow you to write TCP/IP clients and servers. It offers classes such as QFtp that implement specific application-level protocols, lower-level classes such as QTcpSocket , QTcpServer and QUdpSocket 錶示低級網絡概念,和高級類,如 QNetworkRequest , QNetworkReply and QNetworkAccessManager to perform network operations using common protocols. It also offers classes such as QNetworkConfiguration , QNetworkConfigurationManager and QNetworkSession that implement bearer management.
The following classes provide support for network programming in Qt.
| QAbstractSocket | 所有套接字類型共有的基本功能 |
| QAuthenticator | 身份驗證對象 |
| QFtp | Implementation of the client side of FTP protocol |
| QHostAddress | IP 地址 |
| QHostInfo | 用於主機名查找的靜態函數 |
| QHttpMultiPart | 類似於通過 HTTP 被發送的 MIME 多部分消息 |
| QHttpPart | 保持本體部分 (要在 HTTP 多部分 MIME 消息內使用) |
| QNetworkAccessManager | 允許應用程序發送網絡請求和接收迴復 |
| QNetworkAddressEntry | 存儲由網絡接口支持的一個 IP 地址及其關聯的 Netmask (網絡掩碼) 和廣播地址 |
| QNetworkConfiguration | 一個或多個訪問點配置的抽象 |
| QNetworkConfigurationManager | 管理由係統提供的網絡配置 |
| QNetworkInterface | 主機的 IP 地址和網絡接口列錶 |
| QNetworkProxy | 網絡層代理 |
| QNetworkProxyFactory | 細粒度代理選定 |
| QNetworkReply | 包含請求數據和頭 (發送請求采用 QNetworkAccessManager) |
| QNetworkRequest | 保持要采用 QNetworkAccessManager 發送的請求 |
| QNetworkSession | 控製係統訪問點,且當多個客戶端訪問同一訪問點時啓用會話管理 |
| QSocketNotifier | 支持監視文件描述符活動 |
| QSsl | Declares enums common to all SSL classes in QtNetwork |
| QSslCertificate | 用於 X509 證書的便捷 API |
| QSslCipher | 錶示 SSL 加密密碼 |
| QSslConfiguration | 保持 SSL 連接的配置和狀態 |
| QSslError | SSL 錯誤 |
| QSslKey | 用於私鑰和公鑰的接口 |
| QSslSocket | 用於客戶端和服務器兩者的 SSL 加密套接字 |
| QTcpServer | 基於 TCP 的服務器 |
| QTcpSocket | TCP 套接字 |
| QUdpSocket | UDP (用戶數據報協議) 套接字 |
| QUrl | 用於操控 URL 的方便接口 |
| QUrlInfo | Stores information about URLs |
網絡訪問 API 是用於履行常見網絡操作的一批類。API 提供的抽象層覆蓋特定操作和所用協議 (例如:通過 HTTP 獲取和張貼數據),並僅為一般 (或高級) 概念暴露類、函數及信號。
網絡請求的錶示是通過 QNetworkRequest 類,還充當與請求關聯的信息 (譬如:任何 Header 頭信息和使用加密) 的通用容器。構造請求對象時指定的 URL 確定請求使用的協議。目前,上傳和下載支持 HTTP、FTP 和本地文件 URL。
網絡操作協調的履行通過 QNetworkAccessManager 類。一旦請求被創建,此類用於分派它並發射信號來報告其進度。管理器還協調使用 Cookie Cookie 在客戶端存儲數據、身份驗證請求及使用代理。
網絡請求響應的錶示通過 QNetworkReply 類;這些被創建由 QNetworkAccessManager 當分派請求時。信號的提供通過 QNetworkReply 可以用於單獨監視每個迴復,或開發者可以選取使用管理器信號代替此目的並丟棄迴復引用。由於 QNetworkReply 是子類化的 QIODevice ,可以同步或異步處理迴復;即:阻塞或非阻塞操作。
每個應用程序或庫均可以創建一個或多個實例化的 QNetworkAccessManager 來處理網絡通信。
FTP (File Transfer Protocol) is a protocol used almost exclusively for browsing remote directories and for transferring files.
FTP uses two network connections, one for sending commands and one for transferring data. The FTP protocol has a state and requires the client to send several commands before a file transfer takes place. FTP clients establish a connection and keeps it open throughout the session. In each session, multiple transfers can occur.
The QFtp class provides client-side support for FTP. It has the following characteristics:
There are two main ways of using QFtp . The most common approach is to keep track of the command IDs and follow the execution of every command by connecting to the appropriate signals. The other approach is to schedule all commands at once and only connect to the done() signal, which is emitted when all scheduled commands have been executed. The first approach requires more work, but it gives you more control over the execution of individual commands and allows you to initiate new commands based on the result of a previous command. It also enables you to provide detailed feedback to the user.
The FTP example illustrates how to write an FTP client. Writing your own FTP (or HTTP) server is possible using the lower-level classes QTcpSocket and QTcpServer .
TCP (傳輸控製協議) 是用於大多數 Internet 協議 (包括 HTTP 和 FTP) 的低級數據傳輸網絡協議。它是可靠的、麵嚮流的、麵嚮連接的傳輸協議。它尤其適閤於連續數據傳輸。
The QTcpSocket 類為 TCP 提供接口。可以使用 QTcpSocket 以實現標準網絡協議 (譬如:POP3、SMTP 和 NNTP) 及自定義協議。
必須建立到遠程主機和端口的 TCP 連接,在開始傳輸任何數據之前。一旦建立連接,對等方的 IP 地址和端口就是可用的透過 QTcpSocket::peerAddress () 和 QTcpSocket::peerPort ()。在任何時候,對等方都可以關閉連接,然後數據傳輸將立即停止。
QTcpSocket 異步工作並發射信號以報告狀態改變和錯誤,就像 QNetworkAccessManager and QFtp 。它依賴事件循環來檢測傳入數據並自動刷新傳齣數據。可以把數據寫入套接字使用 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 ;見類文檔編製瞭解細節。
Bearer Management controls the connectivity state of the device such that the application can start or stop network interfaces and roam transparently between access points.
The QNetworkConfigurationManager class manages the list of network configurations known to the device. A network configuration describes the set of parameters used to start a network interface and is represented by the QNetworkConfiguration 類。
A network interface is started by openning a QNetworkSession based on a given network configuration. In most situations creating a network session based on the platform specified default network configuration is appropriate. The default network configuration is returned by the QNetworkConfigurationManager::defaultConfiguration () 函數。
On some platforms it is a platform requirement that the application open a network session before any network operations can be performed. This can be tested by the presents of the QNetworkConfigurationManager::NetworkSessionRequired flag in the value returned by the QNetworkConfigurationManager::capabilities () 函數。
另請參閱 承載管理 .