QT网络编程——UDP
目錄
- 一、TCP和UDP編程的區(qū)別
- 二、QUdpSocket類(lèi)所用到的接口函數(shù)
- 三、QT中UDP編程思路
- 四、UDP界面設(shè)計(jì)
- 五、代碼實(shí)現(xiàn)發(fā)送和接收數(shù)據(jù)
- 六、源代碼下載
一、TCP和UDP編程的區(qū)別
1、我們記得TCP網(wǎng)絡(luò)編程中,要分TCP服務(wù)器端和客戶(hù)端,但是UDP網(wǎng)絡(luò)編程中,不分客戶(hù)端和服務(wù)器端了,每個(gè)用戶(hù)既是客戶(hù)端又是服務(wù)器端。
2、TCP中需要用到兩個(gè)類(lèi):QTcpSever和QTcpSocket。而UDP中只需要使用一個(gè)類(lèi)QUdpSocket。
需要用到本地端口,目標(biāo)端口,目標(biāo)IP地址。
其中本地端口:自己為該UDP主機(jī)設(shè)置的端口號(hào),目的是對(duì)方發(fā)送數(shù)據(jù)時(shí),會(huì)發(fā)到本機(jī)此端口上。
目標(biāo)端口:對(duì)方的UDP主機(jī)設(shè)置的端口號(hào),作用是可以在本機(jī)上向某個(gè)IP用戶(hù)的端口上發(fā)送數(shù)據(jù)。
二、QUdpSocket類(lèi)所用到的接口函數(shù)
| bind(quint16 port) | 將socket和指定端口號(hào)進(jìn)行綁定 |
| close() | 關(guān)閉這個(gè)socket |
| readyRead() | 這個(gè)是信號(hào),當(dāng)其它用戶(hù)向本機(jī)的端口上發(fā)送數(shù)據(jù)時(shí),就會(huì)產(chǎn)生這個(gè)信號(hào)。 |
| writeDatagram(QByteArray &datagram, QHostAddress &host, quint16 port) | 數(shù)據(jù)報(bào)發(fā)送,形參分別為數(shù)據(jù)報(bào),目的IP地址,目的端口號(hào) |
| hasPendingDatagram() | socket中有接收到用戶(hù)發(fā)來(lái)的數(shù)據(jù)報(bào)時(shí),返回值為true |
| pendingDatagramSize() | 返回待讀取數(shù)據(jù)報(bào)的大小 |
| readDatagram(char *data, qint64 maxSize) | 讀取數(shù)據(jù)報(bào),返回讀取數(shù)據(jù)報(bào)的字節(jié)數(shù),maxSize為設(shè)置的讀取字節(jié)數(shù),還可以加上源IP和源端口號(hào) |
三、QT中UDP編程思路
1、開(kāi)啟UDP通訊服務(wù):建立QUdpSocket對(duì)象,并用其中的bind()方法就可以將套接字和端口號(hào)進(jìn)行綁定。(一但有用戶(hù)向本主機(jī)的這個(gè)端口號(hào)發(fā)送數(shù)據(jù),就會(huì)產(chǎn)生readyRead信號(hào))
udpSocket->bind(ui->lineEdit_localPort->text().toUInt());2、在readyRead信號(hào)所對(duì)應(yīng)的槽函數(shù)中,接收對(duì)方發(fā)送過(guò)來(lái)的數(shù)據(jù)報(bào)。
用hasPendingDatagrams()函數(shù),判斷是還否有下一個(gè)數(shù)據(jù)報(bào)待接收。如果有,就用readDatagram()函數(shù)讀取指定長(zhǎng)度的數(shù)據(jù)報(bào),并存放在數(shù)組中。
3、通過(guò)writeDatagram()函數(shù)向遠(yuǎn)端IP用戶(hù)的端口號(hào)中發(fā)送數(shù)據(jù)。
udpSocket->writeDatagram(sendbuff.toUtf8().data(),sendbuff.length(),ipAddress,port);注:經(jīng)過(guò)測(cè)試發(fā)現(xiàn),創(chuàng)建的socket套接字,不用bind函數(shù)綁定端口,也可以直接調(diào)用writeDatagram函數(shù),而且能成功發(fā)送到目的主機(jī)的目的端口上去。但是這樣的話,貌似他會(huì)隨機(jī)為該套接字綁定一個(gè)端口,這是我們不希望的,所以調(diào)試時(shí)盡量避免。
四、UDP界面設(shè)計(jì)
五、代碼實(shí)現(xiàn)發(fā)送和接收數(shù)據(jù)
1、在pro文件中添加network模塊,并且在widget.h中導(dǎo)入QUdpSocket頭文件。
QT += core gui network
2、在widget構(gòu)造函數(shù)中創(chuàng)建一個(gè)QUDPSocket對(duì)象
3、對(duì)打開(kāi)按鈕的點(diǎn)擊信號(hào)綁定槽函數(shù),并實(shí)現(xiàn)bind功能
綁定指定端口后,如果對(duì)方發(fā)來(lái)數(shù)據(jù),會(huì)收到readyRead信號(hào)
注:一個(gè)打開(kāi)按鈕,我設(shè)置了兩個(gè)功能,即點(diǎn)擊一次打開(kāi),再次點(diǎn)擊為關(guān)閉。
4、為readyRead信號(hào)綁定的槽函數(shù)實(shí)現(xiàn)功能,主要是接收發(fā)送過(guò)來(lái)的數(shù)據(jù)報(bào)
void Widget::readyRead_slot() {QByteArray byteArray;while(udpSocket->hasPendingDatagrams()) //存在未讀取的數(shù)據(jù)報(bào){byteArray.resize(udpSocket->pendingDatagramSize()); //將數(shù)組的長(zhǎng)度設(shè)置為待讀數(shù)據(jù)報(bào)的大小udpSocket->readDatagram(byteArray.data(),byteArray.size()); //讀取指定大小的數(shù)據(jù),并保存在數(shù)組中ui->plainTextEdit_receive->appendPlainText(QString(byteArray.data())); //顯示在界面的編輯框中}}5、實(shí)現(xiàn)發(fā)送數(shù)據(jù)的功能
void Widget::on_pushButton_send_clicked() {QHostAddress ipAddress; //用來(lái)存儲(chǔ)目標(biāo)主機(jī)IP地址quint16 port; //存儲(chǔ)目標(biāo)主機(jī)端口號(hào)QString sendbuff; //存儲(chǔ)要發(fā)送的字符串ipAddress.setAddress(ui->lineEdit_aimIp->text()); //將編輯框中的ip地址轉(zhuǎn)換為網(wǎng)絡(luò)上可以識(shí)別的IPv4地址sendbuff = ui->lineEdit_send->text();port = ui->lineEdit_aimPort->text().toUInt();//將指定長(zhǎng)度的數(shù)據(jù)封裝稱(chēng)數(shù)據(jù)報(bào),然后發(fā)到IP用戶(hù)的端口上udpSocket->writeDatagram(sendbuff.toUtf8().data(),sendbuff.length(),ipAddress,port); //向目的IP的目的端口發(fā)送指定長(zhǎng)度的數(shù)據(jù) }完結(jié)!!!!
六、源代碼下載
此代碼的源碼
總結(jié)
以上是生活随笔為你收集整理的QT网络编程——UDP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: js进阶 9-5 js如何确认form的
- 下一篇: Taro+react开发(56) 引用第