Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Qt之網絡編程

Qt之網絡編程

編輯:關於Android編程

簡述

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

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

用法

要鏈接到網絡模塊,需要在qmake項目文件中添加:

QT += network

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

#include 

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 高級網絡操作

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

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

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

QNetworkReply 類用於網絡請求的響應,當一個 request 被發出後,QNetworkAccessManager 就會創建相應的響應,通過 QNetworkReply 提供的信號可以單獨監聽每個響應,或者使用 manager 的信號。由於 QNetworkReply 是 QIODevice 的一個子類,可以同步或異步處理響應;也就是說,阻塞或非阻塞操作。

每個應用程序或庫都可以創建一個或多個 QNetworkAccessManager 實例來處理網絡通信。

TCP(QTcpSocket和QTcpServer)

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

這裡寫圖片描述

QTcpSocket 類為 TCP 提供了一個接口。可以使用 QTcpSocket 實現標准網絡協議,例如:POP3、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 將執行指定名稱的查找,當結果准備就緒時,調用槽函數。實際的查詢在一個單獨的線程中完成,利用操作系統的方法來執行名稱查找。

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

網絡代理

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,可以創建一個自定義代理政策。

承載管理

承載管理控制設備的連接狀態,這樣,應用程序可以啟動或停止網絡接口,並且在接入點之間透明地游蕩。

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

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

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

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved