日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[Qt教程] 第36篇 网络(六)UDP

發(fā)布時(shí)間:2024/4/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Qt教程] 第36篇 网络(六)UDP 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[Qt教程]?第36篇 網(wǎng)絡(luò)(六)UDP

樓主 ?發(fā)表于 2013-9-5 11:38:50?|?查看: 241|?回復(fù): 0
UDP
版權(quán)聲明
該文章原創(chuàng)作者yafeilinux,轉(zhuǎn)載請(qǐng)注明出處!


導(dǎo)語(yǔ)
這一節(jié)講述UDP編程的知識(shí)。UDP(UserDatagram Protocol即用戶(hù)數(shù)據(jù)報(bào)協(xié)議)是一個(gè)輕量級(jí)的,不可靠的,面向數(shù)據(jù)報(bào)的無(wú)連接協(xié)議。對(duì)于UDP我們不再進(jìn)行過(guò)多介紹,如果你對(duì)UDP不是很了解,而且不知道它有什么用,那么這里就舉個(gè)簡(jiǎn)單的例子:我們現(xiàn)在幾乎每個(gè)人都使用的騰訊QQ,其聊天時(shí)就是使用UDP協(xié)議進(jìn)行消息發(fā)送的。就像QQ那樣,當(dāng)有很多用戶(hù),發(fā)送的大部分都是短消息,要求能及時(shí)響應(yīng),并且對(duì)安全性要求不是很高的情況下使用UDP協(xié)議。 ? ??在Qt中提供了QUdpSocket 類(lèi)來(lái)進(jìn)行UDP數(shù)據(jù)報(bào)(datagrams)的發(fā)送和接收。這里我們還要了解一個(gè)名詞Socket,也就是常說(shuō)的“套接字”。 Socket簡(jiǎn)單地說(shuō),就是一個(gè)IP地址加一個(gè)port端口。因?yàn)槲覀円獋鬏敂?shù)據(jù),就要知道往哪個(gè)機(jī)子上傳送,而IP地址確定了一臺(tái)主機(jī),但是這臺(tái)機(jī)子上可能運(yùn)行著各種各樣的網(wǎng)絡(luò)程序,我們要往哪個(gè)程序中發(fā)送呢?這時(shí)就要使用一個(gè)端口來(lái)指定UDP程序。所以說(shuō),Socket指明了數(shù)據(jù)報(bào)傳輸?shù)穆窂健?/span> 下面我們將編寫(xiě)兩個(gè)程序,一個(gè)用來(lái)發(fā)送數(shù)據(jù)報(bào),可以叫做客戶(hù)端;另一個(gè)用來(lái)接收數(shù)據(jù)報(bào),可以叫做服務(wù)器端,它們均應(yīng)用UDP協(xié)議。這樣也就構(gòu)成了所謂的C/S(客戶(hù)端/服務(wù)器)編程模型。我們會(huì)在編寫(xiě)程序的過(guò)程中講解一些相關(guān)的網(wǎng)絡(luò)知識(shí)。



環(huán)境:Windows Xp + Qt 4.8.5+QtCreator 2.8.0



目錄

一、發(fā)送端(客戶(hù)端) 二、接收端(服務(wù)器端)




正文


一、發(fā)送端(客戶(hù)端)

1.新建Qt Gui應(yīng)用。 項(xiàng)目名為udpSender,基類(lèi)選擇QWidget,類(lèi)名為Widget。完成后在udpSender.pro文件中添加一行代碼:QT += network,并保存該文件。

2.widget.ui文件中,往界面上添加一個(gè)Push Button,更改其顯示文本為“開(kāi)始廣播”,然后進(jìn)入其單擊事件槽函數(shù)。

3.我們?cè)?/span>widget.h文件中更改。 添加頭文件:#include?<QtNetwork> 添加private私有對(duì)象:QUdpSocket?*sender;

4.我們?cè)?/span>widget.cpp中進(jìn)行更改。 在構(gòu)造函數(shù)中添加:sender?=?new?QUdpSocket(this); 更改“開(kāi)始廣播”按鈕的單擊事件槽函數(shù): void?Widget::on_pushButton_clicked()?//?開(kāi)始廣播 { ? ??QByteArray?datagram?=?"hello?world!"; ? ??sender->writeDatagram(datagram.data(),datagram.size(), ? ?? ?? ?? ?? ?? ?? ?? ???QHostAddress::Broadcast,45454); }

這里定義了一個(gè)QByteArray類(lèi)型的數(shù)據(jù)報(bào)datagram,其內(nèi)容為“hello world!”。然后我們使用QUdpSocket類(lèi)的writeDatagram()函數(shù)來(lái)發(fā)送數(shù)據(jù)報(bào),這個(gè)函數(shù)有四個(gè)參數(shù),分別是數(shù)據(jù)報(bào)的內(nèi)容,數(shù)據(jù)報(bào)的大小,主機(jī)地址和端口號(hào)。對(duì)于數(shù)據(jù)報(bào)的大小,它根據(jù)平臺(tái)的不同而不同,但是這里建議不要超過(guò)512字節(jié)。這里使用了廣播地址QHostAddress::Broadcast,這樣就可以同時(shí)給網(wǎng)絡(luò)中所有的主機(jī)發(fā)送數(shù)據(jù)報(bào)了。對(duì)于端口號(hào),它是可以隨意指定的,但是一般1024以下的端口號(hào)通常屬于保留端口號(hào),所以我們最好使用大于1024的端口,最大為65535。我們這里使用了45454這個(gè)端口號(hào),一定要注意,在下面要講的服務(wù)器程序中,也要使用相同的端口號(hào)。
5.發(fā)送端就這么簡(jiǎn)單,下面可以先運(yùn)行程序。



二、接收端(服務(wù)器端)

1.新建Qt Gui?應(yīng)用 工程名為udpReceiver,基類(lèi)選擇QWidget,類(lèi)名為Widget。完成后在udpSender.pro文件中添加一行代碼:QT += network,并保存該文件。 此時(shí)工程文件列表中應(yīng)包含兩個(gè)項(xiàng)目,如下圖。




2.我們?cè)?/span>udpReceiver項(xiàng)目中的widget.ui文件中,向界面上添加一個(gè)Label部件,更改其顯示文本為“等待接收數(shù)據(jù)!”,效果如下。


3.我們?cè)?/span>udpReceiver工程中的widget.h文件中更改。 添加頭文件:#include?<QtNetwork> 添加private私有對(duì)象:QUdpSocket?*receiver; 添加私有槽函數(shù): private?slots: void processPendingDatagram();

4.我們?cè)?/span>udpReceiver工程中的widget.cpp文件中更改。 在構(gòu)造函數(shù)中: receiver = new QUdpSocket(this); receiver->bind(45454,QUdpSocket::ShareAddress); connect(receiver,SIGNAL(readyRead()), this,SLOT(processPendingDatagram()));
我們?cè)跇?gòu)造函數(shù)中將receiver綁定到45454端口,這個(gè)端口就是上面發(fā)送端設(shè)置的端口,二者必須一樣才能保證接收到數(shù)據(jù)報(bào)。這里使用了綁定模式QUdpSocket::ShareAddress,它表明其他服務(wù)也可以綁定到這個(gè)端口上。因?yàn)楫?dāng)receiver發(fā)現(xiàn)有數(shù)據(jù)報(bào)到達(dá)時(shí)就會(huì)發(fā)出readyRead()信號(hào),所以將其和數(shù)據(jù)報(bào)處理函數(shù)相關(guān)聯(lián)。
數(shù)據(jù)報(bào)處理槽函數(shù)實(shí)現(xiàn)如下:

void?Widget::processPendingDatagram()?//處理等待的數(shù)據(jù)報(bào) { ? ??while(receiver->hasPendingDatagrams())??//擁有等待的數(shù)據(jù)報(bào) ? ??{ ? ?? ??QByteArray?datagram;?//擁于存放接收的數(shù)據(jù)報(bào) //讓datagram的大小為等待處理的數(shù)據(jù)報(bào)的大小,這樣才能接收到完整的數(shù)據(jù) ? ?? ??datagram.resize(receiver->pendingDatagramSize()); ? ?? ??//接收數(shù)據(jù)報(bào),將其存放到datagram中 ? ?? ??receiver->readDatagram(datagram.data(),datagram.size()); ? ?? ??//將數(shù)據(jù)報(bào)內(nèi)容顯示出來(lái) ? ?? ??ui->label->setText(datagram); ? ??} }


5.我們?cè)陧?xiàng)目列表中udpReceiver項(xiàng)目上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單上選擇run菜單來(lái)運(yùn)行該工程。如下圖所示。




6.第一次運(yùn)行該程序時(shí),系統(tǒng)可能會(huì)提示警告,我們選擇“解除阻止”。 注意,如果是在linux下,你可能還需要關(guān)閉防火墻。

7.我們同時(shí)再運(yùn)行udpSender程序。然后點(diǎn)擊其上的“發(fā)送廣播”按鈕,這時(shí)會(huì)在udpReceiver上顯示數(shù)據(jù)報(bào)的內(nèi)容。效果如下。





結(jié)語(yǔ)

可以看到,UDP的應(yīng)用是很簡(jiǎn)單的。我們只需要在發(fā)送端執(zhí)行writeDatagram()函數(shù)進(jìn)行數(shù)據(jù)報(bào)的發(fā)送,然后在接收端綁定端口,并關(guān)聯(lián)readyRead()信號(hào)和數(shù)據(jù)報(bào)處理函數(shù)即可。 ? ??下一節(jié)我們講述TCP的應(yīng)用。




涉及到的源碼:??udpSender.rar?(1.6 KB, 下載次數(shù): 4)??udpReceiver.rar?(1.86 KB, 下載次數(shù): 4)?



總結(jié)

以上是生活随笔為你收集整理的[Qt教程] 第36篇 网络(六)UDP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。