一、UDP的特點
UDP(用戶數據報協議)是一種簡單輕量級、不可靠、面向數據報,無連接的傳輸層協議。而TCP/IP協議卻是有連接的
二、UDP適合應用的幾種情況
1、網絡數據大多為短消息
2、擁有大量客戶端
3、對數據安全性無特殊要求
4、網絡負擔非常重,但對響應速度要求高。
三、利用UDP進行網絡通信
因為upd是無連接的,所以兩個通信設備之間不需要建立連接,只要知道對方的IP地址和端口號就行了。
我們首先創建一個項目,這個項目需要用到ui界面,所以我們還是使用Qtdesigner,並且還要給它布好局。
首先我們需要綁定端口號,如果在同一台電腦上測試IP地址可以不需要綁定,綁定的時候我們用到bind()函數。
例:
udpsocket->bind(8000);
接收數據
當接收到數據的時候,socket會自動觸發readyRead這個信號,所以需要寫一個參函數來處理這個信號,也就是讀取socket接收到的數據。
接收數據的時候我們需要用到這個一個函數
readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)
這個函數的參數的含義如下
1、將讀取的內容存放在data中
2、讀取的長度
3、對方的ip地址
4、對方的端口號
最后將讀取的內容顯示在文本編輯框里就可以了。
發送數據
發送數據的步驟和讀取數據的步驟差不多的,首先需要獲取界面中的端口,ip地址和文本編輯框中的內容,然后通過writeDatagram()這個函數來發送。
writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
這個函數的參數含義如下
1、需要發送的消息
2、對方的IP地址
3、對方的端口號
四、發送和接收的代碼
發送
1 void Widget::on_pushButtonwrite_clicked() 2 { 3 //獲取對方的端口號和ip
4 QString ip = ui->lineEditip->text(); 5 quint16 port = ui->lineEditport->text().toInt(); 6
7 //獲取文本框的內容
8 QString str = ui->textEdit->toPlainText(); 9
10 //將信息發送給指定的ip
11 udpsocket->writeDatagram(str.toUtf8(), (QHostAddress)ip, port); 12 }
接收
1 void Widget::readData() 2 { 3 char buf[1024] = {0}; 4 QHostAddress addr; //對方的ip
5 quint16 port; //對方的端口
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 }
編譯運行之后如下圖
我這里因為需要兩個窗口進行通信,所以將另一個程序的端口號改成了8888。