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