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