自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解析 Qt 網(wǎng)絡(luò)之UDP 網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)

移動(dòng)開發(fā)
在Qt中提供了QUdpSocket 類來進(jìn)行UDP數(shù)據(jù)報(bào)(datagrams)的發(fā)送和接收。這里我們還要了解一個(gè)名詞Socket,也就是常說的“套接字”。

Qt 網(wǎng)絡(luò)UDP 網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)是本文要介紹的內(nèi)容,UDP(User Datagram Protocol即用戶數(shù)據(jù)報(bào)協(xié)議)是一個(gè)輕量級(jí)的,不可靠的,面向數(shù)據(jù)報(bào)的無連接協(xié)議。對于UDP我們不再進(jìn)行過多介紹,如果你對UDP不是很了解,而且不知道它有什么用,那么我們這里就舉個(gè)簡單的例子:我們現(xiàn)在幾乎每個(gè)人都使用的騰訊QQ,其聊天時(shí)就是使用UDP協(xié)議進(jìn)行消息發(fā)送的。就像QQ那樣,當(dāng)有很多用戶,發(fā)送的大部分都是短消息,要求能及時(shí)響應(yīng),并且對安全性要求不是很高的情況下使用UDP協(xié)議。

在Qt中提供了QUdpSocket 類來進(jìn)行UDP數(shù)據(jù)報(bào)(datagrams)的發(fā)送和接收。這里我們還要了解一個(gè)名詞Socket,也就是常說的“套接字”。 Socket簡單地說,就是一個(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è)端口來指定UDP程序。所以說,Socket指明了數(shù)據(jù)報(bào)傳輸?shù)穆窂健?/p>

下面我們將編寫兩個(gè)程序,一個(gè)用來發(fā)送數(shù)據(jù)報(bào),可以叫做客戶端;另一個(gè)用來接收數(shù)據(jù)報(bào),可以叫做服務(wù)器端,它們均應(yīng)用UDP協(xié)議。這樣也就構(gòu)成了所謂的C/S(客戶端/服務(wù)器)編程模型。我們會(huì)在編寫程序的過程中講解一些相關(guān)的網(wǎng)絡(luò)知識(shí)。

(一)發(fā)送端(客戶端)

1、我們新建Qt4 Gui Application,工程名為“udpSender”,選中QtNetwork模塊,Base class選擇QWidget。

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

Qt 網(wǎng)絡(luò)之UDP 網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)

3、我們在widget.h文件中更改。

添加頭文件:#include <QtNetwork>

添加private私有對象:QUdpSocket *sender;

4、我們在widget.cpp中進(jìn)行更改。

在構(gòu)造函數(shù)中添加:sender = new QUdpSocket(this);

更改“開始廣播”按鈕的單擊事件槽函數(shù):

  1. void Widget::on_pushButton_clicked()  //發(fā)送廣播  
  2. {  
  3.     QByteArray datagram = “hello world!”;  
  4.     sender->writeDatagram(datagram.data(),datagram.size(),  
  5.                           QHostAddress::Broadcast,45454);  

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

5.發(fā)送端就這么簡單,我們運(yùn)行程序,效果如下。

Qt 網(wǎng)絡(luò)之UDP 網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)

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

1、我們新建Qt4 Gui Application,工程名為“udpReceiver”,選中QtNetwork模塊,Base class選擇QWidget。此時(shí)工程文件列表中應(yīng)包含兩個(gè)工程,如下圖。

Qt 網(wǎng)絡(luò)之UDP 網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)

2、我們在udpReceiver工程中的widget.ui文件中,向界面上添加一個(gè)Label部件,更改其顯示文本為“等待接收數(shù)據(jù)!”,效果如下。

Qt 網(wǎng)絡(luò)之UDP 網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)

3、我們在udpReceiver工程中的widget.h文件中更改。

添加頭文件:#include <QtNetwork>

添加private私有對象:QUdpSocket *receiver;

添加私有槽函數(shù):

  1. private slots:  
  2. void processPendingDatagram(); 

4、我們在udpReceiver工程中的widget.cpp文件中更改。

在構(gòu)造函數(shù)中:

  1. receiver = new QUdpSocket(this);  
  2. receiver->bind(45454,QUdpSocket::ShareAddress);  
  3. connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));  
  4. 我們在構(gòu)造函數(shù)中將receiver綁定到45454端口,這個(gè)端口就是上面發(fā)送端設(shè)置的端口,二者必須一樣才能保證接收到數(shù)據(jù)報(bào)。
  5. 我們這里使用了綁定模式QUdpSocket::ShareAddress,它表明其他服務(wù)也可以綁定到這個(gè)端口上。因?yàn)楫?dāng)receiver發(fā)現(xiàn)有數(shù)據(jù)
  6. 報(bào)到達(dá)時(shí)就會(huì)發(fā)出readyRead()信號(hào),所以我們將其和我們的數(shù)據(jù)報(bào)處理函數(shù)相關(guān)聯(lián)。  
  7. 數(shù)據(jù)報(bào)處理槽函數(shù)實(shí)現(xiàn)如下:  
  8. void Widget::processPendingDatagram() //處理等待的數(shù)據(jù)報(bào)  
  9. {  
  10.     while(receiver->hasPendingDatagrams())  //擁有等待的數(shù)據(jù)報(bào)  
  11.     {  
  12.         QByteArray datagram; //擁于存放接收的數(shù)據(jù)報(bào)  
  13.         datagram.resize(receiver->pendingDatagramSize());  
  14.         //讓datagram的大小為等待處理的數(shù)據(jù)報(bào)的大小,這樣才能接收到完整的數(shù)據(jù)  
  15.         receiver->readDatagram(datagram.data(),datagram.size());  
  16.         //接收數(shù)據(jù)報(bào),將其存放到datagram中  
  17.         ui->label->setText(datagram);  
  18.         //將數(shù)據(jù)報(bào)內(nèi)容顯示出來  
  19.     }  

5、我們在工程列表中udpReceiver工程上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單上選擇run菜單來運(yùn)行該工程。

Qt 網(wǎng)絡(luò)之UDP 網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)

6、第一次運(yùn)行該程序時(shí),系統(tǒng)可能會(huì)提示警告,我們選擇“解除阻止”。

Qt 網(wǎng)絡(luò)之UDP 網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)

如果是在linux下,你可能還需要關(guān)閉防火墻。

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

Qt 網(wǎng)絡(luò)之UDP 網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)

可以看到,UDP的應(yīng)用是很簡單的。我們只需要在發(fā)送端執(zhí)行writeDatagram()函數(shù)進(jìn)行數(shù)據(jù)報(bào)的發(fā)送,然后在接收端綁定端口,并關(guān)聯(lián)readyRead()信號(hào)和數(shù)據(jù)報(bào)處理函數(shù)即可。
 
本文章原創(chuàng) www.yafeilinux.com   

小結(jié):Qt 網(wǎng)絡(luò)UDP 網(wǎng)絡(luò)基礎(chǔ)學(xué)習(xí)的內(nèi)容介紹完了,希望本文對你有幫助。想要繼續(xù)深入的了解更多資料。請參考:

http://mobile.51cto.com/symbian-268176.htm          Qt網(wǎng)絡(luò)
http://mobile.51cto.com/symbian-268170.htm           http 編程
http://mobile.51cto.com/symbian-268167_1.htm       Qt獲取網(wǎng)絡(luò)地址

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-06-27 09:47:43

2011-06-27 10:15:22

Qt 網(wǎng)絡(luò) TCP

2011-06-27 10:28:45

Qt 網(wǎng)絡(luò) TCP

2011-06-02 10:28:18

2011-06-02 10:28:15

網(wǎng)絡(luò)命令Arp

2011-06-02 11:21:59

Tftp

2011-06-02 14:36:19

Route

2011-06-02 14:36:22

Runas

2011-06-02 10:28:21

Rsh

2011-06-02 14:36:25

Netstat

2011-06-02 11:34:31

Nbtstat

2014-06-13 13:47:31

UDP

2011-06-10 12:17:52

Qt 網(wǎng)絡(luò)

2020-07-28 08:38:10

TCPUDP協(xié)議

2011-06-10 12:44:09

2011-06-02 10:28:11

網(wǎng)絡(luò)命令

2014-09-16 17:00:02

UDP

2011-06-10 13:21:00

Qt 網(wǎng)絡(luò)

2011-06-22 16:18:23

QT 多線程 QSocket

2019-03-29 10:31:53

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)