天天看點

Qt網絡程式設計之二

使用QUdpSocket進行UDP程式設計

       UDP(使用者資料報協定)是一個輕量級的,不可靠的,面向資料報的,無連接配接協定。當可靠性不是很重要的時候就可以使用該協定。例如:一個用于報告時間的伺服器可以使用UDP。如果包含時間的資料報丢失了,那麼用戶端隻需發出另外一個請求。

       QUdpSocket類允許你發送和接收UDP資料報。它繼承自QAbstractSocket,是以它有共享了QTcpSocket的大多數接口。最主要的不同就是QUdpSocket以資料報的形式發送資料,而不像QTcpSocket使用連續的資料流。簡言之,一個資料報就是一個有大小限制資料包(通常小于512bytes),包含發送方的IP位址和端口号、接收方的IP位址和端口号以及要傳輸的資料。

       QUdpSocket支援IPv4廣播。廣播通常是用于實作網絡發現協定,例如尋找網絡上擁有最大空餘磁盤空間的主機。一個主機發出的資料報,網絡上的其它主機都可以接收到。每一個主機都接收到一個請求,然後傳回一個應答資訊給發送者,表明目前可用磁盤空間。發廣播的主機直到接收到所有其它主機的應答資訊才從中選擇可用磁盤空間最大的主機來存儲資料。要廣播一個資料報,僅僅隻需要将該資料報發送給特殊的位址:QHostAddress::Broadcast (255.255.255.255),或者是你本地網絡的廣播位址。

       QUdpSocket::bind()建立用于接收進入的資料報,這個和TCP伺服器的 QTcpServer::listen()十分相似。無論什麼時候當一個或者多個資料報到達時,QUdpSocket就會發送readyRead()信号。調用QUdpSocket::readDatagram()來讀取資料報。

       Broadcast Sender 和 Broadcast Receiver示例展示了如何使用Qt編寫UDP發送者和UDP接收者。

       QUdpSocket同樣支援多點傳播。Multicast Sender 和 Multicast Receiver示例展示了如何編寫UDP多點傳播用戶端。

使用QHostInfo解析主機名稱

       在建立網絡連接配接之前,QTcpSocket和QUdpSocket進行一個名稱查詢,将你連接配接的主機的名稱翻譯為一個IP位址。這個操作通常都是使用DNS(域名服務)協定。

       QHostInfo提供了一個靜态的方法,使得你可以自己完成這個查詢操作。提供使用一個主機名、一個QObject指針和一個槽函數作為參數調用QHostInfo::lookupHost(),QHostInfo将會執行名稱查詢,并且在查詢結束的時候調用已經指定的槽函數。實際的查詢操作将會在一個單獨的線程中完成,利用作業系統自己的方法進行名稱查詢操作。

       QHostInfo也提供了一個稱為QHostInfo::fromName()的靜态方法,該方法将主機名作為參數和傳回的結果。在這種情況下,查詢操作與函數調用者在一個線程中完成。這個重載對于非GUI應用或将查詢操作放在一個單獨的,非GUI的線程中是十分有用的。(在一個GUI線程中調用這個函數可能會在它執行查詢操作的時候導緻你的UI當機。)

支援網絡代理

       使用Qt進行網絡通信可以通過代理完成,也就是在本地和遠端的連接配接中指向或者過濾網絡路徑。

       單個的代理是由QNetworkProxy類呈現的,該類用來描述和配置到代理的接連。不同層次的網絡通信代理類型都得到了支援,由于SOCKS 5的支援,使得允許在一個低層次的網絡流量使用代理,HTTP和FTP代理工作在協定層次。檢視QNetworkProxy::ProxyType擷取更多的資訊。

       代理可以在一個應用程式的單個套接字或者全部網絡通信上使能。一個新打開的套接字在它被連接配接之前可以通過調用QAbstractSocket::setProxy()函數來使用代理。應用程式範圍的代理可以通過調用QNetworkProxy::setApplicationProxy()函數對所有的套接字連接配接使能的。

       代理工廠主要用于建立代理使用的政策。QNetworkProxyFactory是通過基于查詢具體代理類型來支援代理的。 查詢本身是使用QNetworkProxyQuery對象來編碼的,該對象以基于關鍵的标準來選擇使能的代理,,例如,代理的目的(TCP,UDP連接配接,TCP伺服器,URL請求),本地的端口,遠端主機和端口,使用的協定(HTTP,FTP等)。

QNetworkProxyFactory::proxyForQuery()被用來直接的查詢工廠。一個應用程式範圍的代理的政策可以通過傳遞一個factory給QNetworkProxyFactory::setApplicationProxyFactory()來實作,并且自定義的程式級代理政策可以通過建立QNetworkProxyFactor的子類實作,檢視相應的類文檔擷取詳細資訊。

Bearer Management支援

       Bearer Management控制着裝置的連接配接狀态,例如:應用程式可以啟動和停止網絡接口,并且在接入點之間透明的漫遊。

       QNetworkConfigurationManager類管理者裝置所知的一系列網絡配置。一個網絡配置描述了啟動網絡接口的參數集合,并且使用QNetworkConfiguration類代表。

       一個網絡接口通過給定的網絡配置打開一個QNetworkSession來完成啟動。大多數情況下,基于特定平台預設的網絡配置建立網絡會話是合适的。預設的網絡配置是函數QNetworkConfigurationManager::defaultConfiguration()傳回的。

       在一些平台上,平台要求應用程式在進行任何網絡操作之前打開一個網絡會話。這個可以通過

QNetworkConfigurationManager::capabilities()函數傳回QNetworkConfigurationManager::NetworkSessionRequired

的值來測試。