一、UDP的特點(diǎn)
UDP(用戶數(shù)據(jù)報(bào)協(xié)議)是一種簡(jiǎn)單輕量級(jí)、不可靠、面向數(shù)據(jù)報(bào),無(wú)連接的傳輸層協(xié)議。而TCP/IP協(xié)議卻是有連接的
二、UDP適合應(yīng)用的幾種情況
1、網(wǎng)絡(luò)數(shù)據(jù)大多為短消息
2、擁有大量客戶端
3、對(duì)數(shù)據(jù)安全性無(wú)特殊要求
4、網(wǎng)絡(luò)負(fù)擔(dān)非常重,但對(duì)響應(yīng)速度要求高。
三、利用UDP進(jìn)行網(wǎng)絡(luò)通信
因?yàn)閡pd是無(wú)連接的,所以兩個(gè)通信設(shè)備之間不需要建立連接,只要知道對(duì)方的IP地址和端口號(hào)就行了。
我們首先創(chuàng)建一個(gè)項(xiàng)目,這個(gè)項(xiàng)目需要用到ui界面,所以我們還是使用Qtdesigner,并且還要給它布好局。
首先我們需要綁定端口號(hào),如果在同一臺(tái)電腦上測(cè)試IP地址可以不需要綁定,綁定的時(shí)候我們用到bind()函數(shù)。
CSDN?QT大綱:Qt開發(fā)必備技術(shù)棧學(xué)習(xí)路線和資料
例:
udpsocket->bind(8000);
接收數(shù)據(jù)
當(dāng)接收到數(shù)據(jù)的時(shí)候,socket會(huì)自動(dòng)觸發(fā)readyRead這個(gè)信號(hào),所以需要寫一個(gè)參函數(shù)來(lái)處理這個(gè)信號(hào),也就是讀取socket接收到的數(shù)據(jù)。
接收數(shù)據(jù)的時(shí)候我們需要用到這個(gè)一個(gè)函數(shù)
readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)
這個(gè)函數(shù)的參數(shù)的含義如下
1、將讀取的內(nèi)容存放在data中
2、讀取的長(zhǎng)度
3、對(duì)方的ip地址
4、對(duì)方的端口號(hào)
最后將讀取的內(nèi)容顯示在文本編輯框里就可以了。
發(fā)送數(shù)據(jù)
發(fā)送數(shù)據(jù)的步驟和讀取數(shù)據(jù)的步驟差不多的,首先需要獲取界面中的端口,ip地址和文本編輯框中的內(nèi)容,然后通過(guò)writeDatagram()這個(gè)函數(shù)來(lái)發(fā)送。
writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
這個(gè)函數(shù)的參數(shù)含義如下
1、需要發(fā)送的消息
2、對(duì)方的IP地址
3、對(duì)方的端口號(hào)
四、發(fā)送和接收的代碼
發(fā)送
1 void Widget::on_pushButtonwrite_clicked()
2 {
3 //獲取對(duì)方的端口號(hào)和ip
4 QString ip = ui->lineEditip->text();
5 quint16 port = ui->lineEditport->text().toInt();
6
7 //獲取文本框的內(nèi)容
8 QString str = ui->textEdit->toPlainText();
9
10 //將信息發(fā)送給指定的ip
11 udpsocket->writeDatagram(str.toUtf8(), (QHostAddress)ip, port);
12 }
接收
1 void Widget::readData()
2 {
3 char buf[1024] = {0};
4 QHostAddress addr; //對(duì)方的ip
5 quint16 port; //對(duì)方的端口
6 qint64 len;
7 len = udpsocket->readDatagram(buf, sizeof(buf), &addr, &port);
8 {
9 if(len > 0)
10 {
11 QString str = QString("[%1:%2] %3").arg(addr.toString()).arg(port).arg(buf);
12 ui->textEdit->setText(str);
13 }
14 }
15 }
編譯運(yùn)行之后如下圖
?我這里因?yàn)樾枰獌蓚€(gè)窗口進(jìn)行通信,所以將另一個(gè)程序的端口號(hào)改成了8888。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-437011.html
本文福利,莬費(fèi)領(lǐng)取Qt開發(fā)學(xué)習(xí)資料包、技術(shù)視頻,內(nèi)容包括(C++語(yǔ)言基礎(chǔ),Qt編程入門,QT信號(hào)與槽機(jī)制,QT界面開發(fā)-圖像繪制,QT網(wǎng)絡(luò),QT數(shù)據(jù)庫(kù)編程,QT項(xiàng)目實(shí)戰(zhàn),QT嵌入式開發(fā),Quick模塊等等)↓↓↓↓↓↓見下面↓↓文章底部點(diǎn)擊莬費(fèi)領(lǐng)取↓↓文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-437011.html
到了這里,關(guān)于Qt 利用UDP進(jìn)行通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!