柚子快報邀請碼778899分享:Qt之UDP編程
柚子快報邀請碼778899分享:Qt之UDP編程
Qt之UDP編程
UDP概述
用戶數(shù)據(jù)報協(xié)議(User Data Protocol,UDP)是一種簡單輕量級、不可靠、面向數(shù)據(jù)報、無連接的傳輸層協(xié)議,可以應(yīng)用在可靠性不是十分重要的場合,如短消息、廣播信息等。
UDP主要特點
UDP的主要特點是: (1)UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接,因此減少了開銷和發(fā)送數(shù)據(jù)之前的時延; (2)UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持復(fù)雜的連接狀態(tài)表; (3)UDP是面向報文的。應(yīng)用層交給UDP多長的報文,UDP就照樣發(fā)送,即一次發(fā)送一個報文; (4)UDP沒有阻塞控制,網(wǎng)絡(luò)出現(xiàn)的擁塞不會使源主機的發(fā)送速率降低。很多的實時應(yīng)用要求源主機以恒定的發(fā)送速率發(fā)送數(shù)據(jù),并且允許在網(wǎng)絡(luò)發(fā)生擁塞時丟失一些數(shù)據(jù),單卻不允許數(shù)據(jù)有太大的時延; (5)UDP支持一對一、一對多、多對一和多對多的交互通信; (6)UDP的首部開銷小,只有8個字節(jié),比TCP的20個字節(jié)的首部要短。
UDP的應(yīng)用問題: (1)在使用沒有擁塞控制的UDP時,若很多的源主機同時都向網(wǎng)絡(luò)發(fā)送高速率的實時數(shù)據(jù)時(例如,多臺主機同時高速率的廣播數(shù)據(jù)),網(wǎng)絡(luò)就有可能發(fā)生擁塞,結(jié)果大家都無法正常接收。因此,不使用擁塞控制功能的UDP有可能會引起網(wǎng)絡(luò)產(chǎn)生嚴重的擁塞問題; (2)有些應(yīng)用需要對UDP的不可靠傳輸進行適當(dāng)?shù)母倪M,以減少數(shù)據(jù)的丟失。例如采用前向糾錯或重傳已丟失的報文等方式。
UDP適用場景
UDP適合應(yīng)用的情況有以下幾種: (1)網(wǎng)絡(luò)數(shù)據(jù)大多為短消息; (2)擁有大量客戶端; (3)對數(shù)據(jù)安全性無特殊要求; (4)網(wǎng)絡(luò)負擔(dān)非常中,但對響應(yīng)速度要求高。
UDP編程
Qt之UDP單播
UDP單播沒有客戶端和服務(wù)器之分,因為從編程角度講,無論是客戶端和服務(wù)器的網(wǎng)絡(luò)初始化都是一樣的,分別為創(chuàng)建QUdpSocket對象,綁定套接字,收發(fā)消息。
單播實現(xiàn)
(1)新建SingletUDPServer項目,窗口采用Mainwindow,設(shè)計有消息框、消息發(fā)送按鈕,接收端口、地址,發(fā)送端口、地址等界面元素。Mainwindow.h聲明了3個槽函數(shù),分別為消息發(fā)送函數(shù):void on_pushButton_SendMsg_clicked(),網(wǎng)絡(luò)初始化函數(shù):void on_pushButton_clicked(),接收客戶端消息函數(shù):void onReadyRead()。 (2)構(gòu)造函數(shù)初始化了接收、發(fā)送地址和端口。 (3)網(wǎng)絡(luò)初始化,用于綁定套接字 (4)消息發(fā)送槽函數(shù):實現(xiàn)了向另一端的數(shù)據(jù)發(fā)送,并將數(shù)據(jù)顯示到文本框內(nèi)。(突發(fā)奇想,略做了一個小功能,和微信一樣,發(fā)送的消息顯示在文本框的右側(cè)對齊;接收的消息顯示在文本框的左側(cè)對齊。) (5)消息接收函數(shù)
功能演示
為了測試UDP單播功能,上文編寫的UDP單播程序運行兩次,分別作為一個端,模擬端對端的數(shù)據(jù)收發(fā)。(備注:記得修改接收、發(fā)送端口號,端不要綁定相同端口)
Qt之UDP多播
UDP多播,我把它看作分布式,每個端點之間不存在耦合。若加入組播網(wǎng),就可以和其他節(jié)點共享數(shù)據(jù);退出組播就無法共享數(shù)據(jù)。
多播實現(xiàn)
(1)新建MulticastUDP項目,窗口采用Mainwindow,設(shè)計有消息框、消息發(fā)送按鈕,組播端口、地址,加入組播、退出組播等界面元素。Mainwindow.h聲明了6個槽函數(shù),分別為加入組播函數(shù):void on_pushButton_Join_clicked(),退出組播函數(shù):void on_pushButton_Leave_clicked(),消息框清除函數(shù):void on_pushButton_Clear_clicked(),窗口關(guān)閉函數(shù):void on_pushButton_Clear_clicked(),消息發(fā)送函數(shù):void on_pushButton_SendMsg_clicked(),接收客戶端消息函數(shù):void onReadyRead()。 (2)設(shè)置組播 (3)綁定組播端口,加入組播 (4)退出組播 (5)發(fā)送組播消息 (6)接收組播消息
功能演示
Qt之UDP廣播
Qt之UDP廣播:服務(wù)端負責(zé)以計時器廣播發(fā)送數(shù)據(jù);客戶端負責(zé)接收數(shù)據(jù),并實時匯報收到的消息條數(shù)。
服務(wù)端實現(xiàn)
(1)新建BroadcastUDPServer項目,窗口采用Mainwindow,設(shè)計有消息框、消息發(fā)送按鈕,廣播端口、地址,接收端口、地址等界面元素。Mainwindow.h聲明了3個槽函數(shù),分別為消息發(fā)送函數(shù):void on_pushButton_SendMsg_clicked(),定時器函數(shù)void onTimeout(),接收客戶端消息函數(shù):void onReadyRead()。 (2)構(gòu)造函數(shù),初始化網(wǎng)絡(luò),用端口35533接收客戶端消息。 (3)消息發(fā)送槽函數(shù),實現(xiàn)計時器打開、關(guān)閉功能。 (4)計時器槽函數(shù),實現(xiàn)消息廣播功能。QHostAddress::Broadcast來表示廣播地址,它等價于QHostAddress(“255.255.255.255”)。對于端口號是可以隨意指定的,但一般建議使用1024以上的端口號,因為1024以下的端口號通常用于保留端口號,端口號最大為65535。廣播端口需要與客戶端綁定端口一致,否則無法傳送數(shù)據(jù)。 (5)網(wǎng)絡(luò)數(shù)據(jù)接收槽函數(shù),實現(xiàn)對客戶端數(shù)據(jù)的接收功能。peerAddress代表客戶端的地址,peerPort代表客戶端的端口。
客戶端實現(xiàn)
(1)客戶端接收網(wǎng)絡(luò)中的廣播數(shù)據(jù),并向服務(wù)端發(fā)送接收條數(shù)信息,共包含接收槽函數(shù):void on_pushButton_Receive_clicked(),廣播數(shù)據(jù)接收槽函數(shù):void onReadyRead()。 (2)接收槽函數(shù),實現(xiàn)網(wǎng)絡(luò)端口綁定功能。 (3)網(wǎng)絡(luò)接收槽函數(shù),實現(xiàn)廣播數(shù)據(jù)的接收和接收條數(shù)的發(fā)送功能。
功能演示
分別運行UDP廣播服務(wù)器和UDP客戶端程序??蛻舳私邮斩丝谠O(shè)置為35544,服務(wù)器端口設(shè)置為35533,點擊開始,等待服務(wù)器廣播數(shù)據(jù);服務(wù)器端采用默認廣播端口35544,地址255.255.255.255,消息內(nèi)容輸入Are you OK? 點擊發(fā)送,周期地廣播消息。運行圖如下所示:
柚子快報邀請碼778899分享:Qt之UDP編程
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。