Qt之網絡編程

簡述

Qt Network模塊提供的類容許編寫 TCP/IP clients 和 servers。算法

其中包含一些低級別的類,例如:QTcpSocket、QTcpServer 和 QUdpSocket,表示低級的網絡概念;一些高級別的類,例如:QNetworkRequest、QNetworkReply 和 QNetworkAccessManager,使用常見的協議執行網絡操做;它還提供其餘的類,例如:QNetworkConfiguration、QNetworkConfigurationManager 和QNetworkSession 用於承載管理。編程

用法

要連接到網絡模塊,須要在qmake項目文件中添加:緩存

QT += network
  • 1
  • 1

若是你打算在應用程序中使用Qt Network類,使用下面的 include 語句:cookie

#include <QtNetwork>
  • 1
  • 1

Qt 網絡編程類

Qt Network 中的 C++ 類列表:網絡

描述
QAbstractNetworkCache 爲緩存實現的接口
QAbstractSocket 包含全部 socket 類型的基礎功能
QAuthenticator 認證對象
QDnsDomainNameRecord 存儲關於域名記錄的信息
QDnsHostAddressRecord 存儲關於主機地址記錄的信息
QDnsLookup 表示一個DNS查詢
QDnsMailExchangeRecord 存儲有關 DNS MX 記錄的信息
QDnsServiceRecord 存儲有關 DNS SRV 記錄的信息
QDnsTextRecord 存儲有關 DNS TXT 記錄的信息
QHostAddress IP地址
QHostInfo 主機名查詢靜態函數
QHttpMultiPart 相似於一個 MIME 多個部分消息,經過HTTP發送
QHttpPart 持有一個 body 部分,用於 HTTP 多個部分的 MINE 消息
QLocalServer 本地 socket 依賴的 server
QLocalSocket 本地 socket
QNetworkAccessManager 容許程序發送網絡請求和接收響應
QNetworkAddressEntry 存儲一個 IP 地址,經過網絡接口的支持,連同相關的網絡掩碼和廣播地址
QNetworkCacheMetaData 緩存信息
QNetworkConfiguration 一個或多個配置接入點的抽象概念
QNetworkConfigurationManager 管理由系統提供的網絡配置
QNetworkCookie 管理由系統提供的網絡配置
QNetworkCookieJar 實現 QNetworkCookie 對象的一個簡單jar
QNetworkDiskCache 很是基本的磁盤緩存
QNetworkInterface 主機的IP地址和網絡接口列表
QNetworkProxy 網絡層代理
QNetworkProxyFactory 精細的代理選擇
QNetworkProxyQuery 用於查詢一個 socket 的代理設置
QNetworkReply 包含 QNetworkAccessManager 發送的請求數據和消息頭
QNetworkRequest 持有一個 QNetworkAccessManager 發送的請求
QNetworkSession 控制系統的接入點並啓用例的會話管理,爲了當多個客戶端訪問相同的接入點
QSslCertificate 用於 X509 證書的方便 API
QSslCertificateExtension 用於訪問 X509 證書擴展的API
QSslCipher 表明一個SSL加密密碼
QSslConfiguration 持有 SSL 鏈接的配置及狀態
QSslEllipticCurve 表明了一種橢圓曲線使用橢圓曲線密碼算法
QSslError SSL 錯誤
QSslKey 私鑰和公鑰的接口
QSslPreSharedKeyAuthenticator 預共享密鑰認證數據(PSK)密碼套件
QSslSocket clients 和 servers 的 SSL 加密 socket
QTcpServer 基於 TCP 的 server
QTcpSocket TCP socket
QUdpSocket UDP socket

HTTP 和 FTP 高級網絡操做http://www.woaipu.com/shops/zuzhuan/61406

網絡訪問 API 是 一個用於執行常見的網絡操做的類集合。該 API 在特定操做和協議使用上(例如:經過 HTTP 獲取和發佈數據)提供了一個抽象層,而且只有共有類、函數和信號用於通常或高級別的概念。多線程

QNetworkRequest 類用於表示網絡請求,它也充當一個與請求信息相關的通用容器,例如:任何頭信息和使用的加密相關的信息。當一個 request 對象被構造時,指定的 URL 決定所用的協議。目前 HTTP、FTP 和本地文件 URLs 支持上傳和下載。併發

QNetworkAccessManager 類用於協調網絡操做,一旦建立一個 request,該類用來發出請求併發射信號來報告它的進度。manager 也協調 cookies 的使用在 client 存儲數據、請求的身份驗證、代理的使用。異步

QNetworkReply 類用於網絡請求的響應,當一個 request 被髮出後,QNetworkAccessManager 就會建立相應的響應,經過 QNetworkReply 提供的信號能夠單獨監聽每一個響應,或者使用 manager 的信號。因爲 QNetworkReply 是 QIODevice 的一個子類,能夠同步或異步處理響應;也就是說,阻塞或非阻塞操做。socket

每一個應用程序或庫均可以建立一個或多個 QNetworkAccessManager 實例來處理網絡通訊。tcp

TCP(QTcpSocket和QTcpServer)

TCP(Transmission Control Protocol - 傳輸控制協議)是一個底層網絡協議,被用於大多數互聯網協議,包括:HTTP 和 FTP,進行數據傳輸。它是一種面向鏈接的、可靠的、基於字節流的傳輸層通訊協議,特別適合數據的連續傳輸。

這裏寫圖片描述

QTcpSocket 類爲 TCP 提供了一個接口。可使用 QTcpSocket 實現標準網絡協議,例如:POP三、SMTP 和 NNTP,也能夠自定義協議。

在任何數據傳輸開始以前,必須創建一個 TCP 鏈接到遠程的主機和端口。一旦創建了鏈接,對等的 IP 地址和端口能夠經過 QTcpSocket::peerAddress() 和 QTcpSocket::peerPort() 來獲取。在任什麼時候候,任何一方均可以關閉鏈接,這時數據傳輸將當即中止。

QTcpSocket 異步執行,併發出信號以報告狀態變化和錯誤,就像 QNetworkAccessManager 同樣。它依賴於事件循環,以檢測輸入的數據,並自動地刷新傳出數據。可使用 QTcpSocket::write() 將數據寫入到 socket,並使用 QTcpSocket::read() 來讀取。QTcpSocket 表示兩個獨立的數據流:一個用於讀取,一個用於寫入。

因爲 QTcpSocket 繼承自 QIODevice,能夠同 QTextStream、QDataStream 一塊兒使用它。當從一個 QTcpSocket 讀取時,必須先調用 QTcpSocket::bytesAvailable() 以確保有足夠可用的數據。

若是須要處理傳入的 TCP 鏈接(例如:在一個 server 應用程序),使用 QTcpServer 類。調用 QTcpServer::listen() 來設置 server,並鏈接 QTcpServer::newConnection() 信號,一旦有 client 鏈接進入,就會發射此信號。在你的槽函數中,調用 QTcpServer::nextPendingConnection() 來接受鏈接,並使用返回的 QTcpSocket 與 client 通訊。

雖然它的大部分函數異步執行,它可使用 QTcpSocket 同步(即:阻塞)。爲了獲取阻塞行爲,調用 QTcpSocket 的 waitFor…() 函數,這將掛起調用線程,直到信號發出。例如:調用非阻塞函數 QTcpSocket::connectToHost() 以後,調用 QTcpSocket::waitForConnected() 阻塞線程,直到 connected() 信號被髮射。

同步 sockets 每每用於更簡單的流控制,waitFor…() 函數的主要缺點是,當一個 waitFor…() 阻塞時,事件就不會被處理。若是在 GUI 線程中使用,這可能凍結應用程序的用戶界面。出於這個緣由,建議只在非 GUI 線程中使用同步 sockets。當同步使用時,QTcpSocket 並不須要一個事件循環。

Fortune Client 和 Fortune Server 示例展現瞭如何使用 QTcpSocket 和 QTcpServer 來寫 TCP client-server 應用程序。參考 Blocking Fortune Client 示例,瞭解如何在一個獨立的線程中(沒有使用事件循環)使用同步 QTcpSocket;參考 Threaded Fortune Server 示例,瞭解一個多線程 TCP server,其每一個激活的 client 都有一個線程。

UDP(QUdpSocket)

UDP(User Datagram Protocol - 用戶數據報協議)是一個輕量級的、不可靠的、面向數據報、無鏈接的協議。當可靠性不重要時,可使用它。例如:用於報告天天時間的一個 server 能夠選擇 UDP,若是天天時間的一個數據報丟失了,client 能夠簡單地發出另一個請求。

這裏寫圖片描述

QUdpSocket 類容許發送和接收 UDP 數據報,繼承自 QAbstractSocket,並所以享有 QTcpSocket 的大部分接口。主要區別是 QUdpSocket 傳輸數據做爲一個數據報,而非一個連續的數據流。簡而言之,數據報是一個有限大小的數據包(一般小於 512 字節),包含數據報發送方和接收方的IP地址和端口,除了數據傳輸。

QUdpSocket 支持 IPv4 廣播。廣播一般是用於實現網絡發現協議。例如:發現哪一臺網絡主機有較空閒的硬盤空間。一個主機廣播數據報給網絡,全部其餘主機接收。每一個主機接收請求,而後發送應答(當前的空閒磁盤空間)給發送方。發起人等待,直到它收到全部主機的回覆,並能夠選擇有較大空間的 server 來存儲數據。要廣播數據報,只需簡單地將其發送到特殊地址 QHostAddress::Broadcast(255.255.255.255),或者到你本地的網絡廣播地址。

QUdpSocket::bind() 準備了socket 用於接受傳入數據包,很像用於 TCP servers 的 QTcpServer::listen()。當一個或多個數據報到達時,QUdpSocket 會發射 readyRead() 信號,調用 QUdpSocket::readDatagram() 來讀取數據報。

Broadcast Sender 和 Broadcast Receiver 示例展現瞭如何使用 Qt 寫一個 UDP 發送者和接受者。

QUdpSocket 還支持多播。Multicast Sender 和 Multicast Receiver 示例展現瞭如何寫 UDP 多播 clients。

QHostInfo 解析主機名

在創建一個網絡鏈接以前,QTcpSocket 和 QUdpSocket 會執行一個名稱查找,將你所鏈接到的主機名稱轉換成 IP 地址。這個操做一般使用 DNS(Domain Name Service - 域名服務)協議執行。

QHostInfo 提供了一個靜態函數,經過調用 QHostInfo::lookupHost(),參數爲:一個主機名、一個 QObject 指針和一個槽函數簽名。QHostInfo 將執行指定名稱的查找,當結果準備就緒時,調用槽函數。實際的查詢在一個單獨的線程中完成,利用操做系統的方法來執行名稱查找。http://www.woaipu.com/shops/zuzhuan/61406

QHostInfo 還提供了一個靜態函數 QHostInfo::fromName() ,須要將主機名做爲參數,並返回結果。這種狀況下,名稱查詢的執行與調用者處於相同的線程中。這對於非 GUI 應用程序或在一個單獨的、非 GUI 線程中作名稱查找是比較有用的(在 GUI 線程中調用這個函數可能會致使你的用戶界面凍結而功能塊執行查找)。

網絡代理http://www.woaipu.com/shops/zuzhuan/61406

Qt 網絡通訊能夠經過代理來執行,將直接或過濾本地和遠程鏈接之間的網絡流量。

QNetworkProxy 類表示我的代理,用於描述和配置到一個代理的鏈接。代理類型,操做在網絡通訊支持的不一樣級別上,SOCKS 5 支持容許網絡流量的代理在低級別上, HTTP 和 FTP 代理工做在協議級別上。參考 QNetworkProxy::ProxyType 得到更多信息。

代理能夠用於每一個socket 或應用程序中全部網絡通訊。一個新開的 socket 在它鏈接以前,能夠經過調用 QAbstractSocket::setProxy() 函數使用代理。經過使用 QNetworkProxy::setApplicationProxy() 函數,能夠在程序範圍內爲後續的 socket 鏈接啓用代理。

代理工廠用於建立代理使用的策略。QNetworkProxyFactory 提供的代理基於查詢特定的代理類型。查詢自己以 QNetworkProxyQuery 對象進行編碼,該對象啓用代理能夠被選擇基於主要標準,例如:代理的用途(TCP、UDP、TCP server、URL request),本地端口、遠程主機和端口、使用的協議(HTTP、FTP等)。

QNetworkProxyFactory::proxyForQuery() 用於直接查詢工廠。經過傳遞一個工廠給 QNetworkProxyFactory::setApplicationProxyFactory(),能夠實現程序範圍內的代理策略,經過子類化QNetworkProxyFactory,能夠建立一個自定義代理政策。

承載管理

http://www.woaipu.com/shops/zuzhuan/61406

承載管理控制設備的鏈接狀態,這樣,應用程序能夠啓動或中止網絡接口,而且在接入點之間透明地遊蕩。

QNetworkConfigurationManager 類管理已知設備的網絡配置列表,網絡配置由 QNetworkConfiguration 類表示,描述了一組用於啓動網絡接口的參數。

經過打開基於一個網路配置的 QNetworkSession,一個網絡接口被打開。大多數狀況,建立一個基於平臺指定默認網絡配置的網絡會話是合適的。默認網絡配置由 QNetworkConfigurationManager::defaultConfiguration() 函數返回。

某些平臺上,在執行任何網絡操做以前,要求應用程序打開網絡會話。能夠經過QNetworkConfigurationManager::capabilities()函數返回的值進行測試,判斷是否包含給出的QNetworkConfigurationManager::NetworkSessionRequired標誌。

相關文章
相關標籤/搜索