QT 基于UDP的网络广播程序

您所在的位置:网站首页 udp支持广播发送数据吗 QT 基于UDP的网络广播程序

QT 基于UDP的网络广播程序

2023-10-28 09:25| 来源: 网络整理| 查看: 265

先来看一下效果图 在这里插入图片描述 流程就是分别实现UDP下的客户端和服务器端。 开始之前,先说一下UDP的特点, 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 选自《Qt5 开发及实例》陆文周著

接下来开始我们的实例

首先创建服务器端的项目,我这里使用的基类为QDialog,并在ui界面作如下部署 在这里插入图片描述 然后在.pro里添加

QT += network

在.h文件中添加头文件

#include #include #include

类里添加

private slots: void timeout(); //按钮的响应函数 void on_pushButton_clicked();

私有属性里添加

quint16 port; bool isStarted; QUdpSocket *udpSocket; QTimer *timer;

然后在对应的cpp文件中的构造函数中添加

port = 5555; isStarted = false; udpSocket = new QUdpSocket(this); timer = new QTimer(this); //定时发送广播消息 connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));

在这里插入图片描述

现在实现开始按钮的响应函数

if(!isStarted) { ui->pushButton->setText(tr("停止")); timer->start(1000); isStarted = true; } else { ui->pushButton->setText(tr("开始")); isStarted = false; timer->stop(); udpSocket->abort();//用于解绑端口 }

就像这样 在这里插入图片描述 继续实现timeout()函数

udpSocket->bind(port);//绑定到port端口 //udpSocket->abort();//用于解绑端口 QString msg = ui->lineEdit->text(); //int length = 0; if(msg == "") { return; } QByteArray datagram; datagram.append(msg);//数据报填充字节数据 QHostAddress RemoteIP("192.168.56.1");//添加远端IP quint16 RemotePort(port);//添加远端端口号 udpSocket->writeDatagram(datagram,RemoteIP,RemotePort);

在这里插入图片描述 这样服务器端就完成了,接下来实现客户端

同理创建客户端项目,在ui界面如下部署 在这里插入图片描述 close按钮用来关闭程序 同样需要在.pro里添加

QT += network

在.h文件中添加头文件

#include

在类里添加

private slots: void on_pushButton_clicked(); void dataReceived();

在私有属性里定义如下变量

quint16 port; QUdpSocket *udpSocket;

这里是我的.h文件(部分) 在这里插入图片描述 然后在对应的cpp文件的构造函数添加

setWindowTitle(tr("UDP Client")); port = 5555; udpSocket = new QUdpSocket(this); //这里需要注意一下, /* 连接QIODevice的readyRead()信号。 QUdpSocket也是一个I/O设备,从QIODevice继承而来,当有数据到达 I/O设备时,发出readyRead()信号 */ connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived())); //绑到指定的端口号 bool result = udpSocket->bind(port); //qDebug() QByteArray datagram; datagram.resize(udpSocket->pendingDatagramSize());//设置字节数组大小 QHostAddress remoteIP("192.168.56.1");//接收远端IP quint16 remotePort(port);//接收远端端口号 udpSocket->readDatagram(datagram.data(),datagram.size(),&remoteIP,&remotePort);//读取数据 QString str=datagram.data();//将读取的数据转化为字符串 ui->textEdit->insertPlainText(str+"\n"); }

最后附上QT创建UDP的流程以及基本函数功能表

函数功能bool bind (quint16 port)为UDP通信绑定一个端口bool abort ( )释放为UDP绑定的端口qint64 writeDatagram(QByteArray &datagram, QHostAddress &host, quint16 port)数据报发送,形参分别为数据报,目的IP地址,目的端口号bool hasPendingDatagram()接收到数据报时,返回值为trueqint64 pendingDatagramSize()返回待读取数据报的大小qint64 readDatagram(char *data, qint64 maxSize)读取数据报,返回读取数据报的字节数,maxSize为设置的读取字节数,还可以加上源IP和源端口号

UDP发送

QUdpSocket *udpSocket; //端口绑定与解绑操作 quint16 port=8080; udpSocket->bind(port);//绑定到port端口 udpSocket->abort();//用于解绑端口 //发送数据报操作 QByteArray datagram; datagram.append(0xAA);//数据报填充字节数据 QHostAddress RemoteIP(“192.168.0.1”);//添加远端IP quint16 RemotePort(port);//添加远端端口号 udpSocket->writeDatagram(datagram,RemoteIP,RemotePort);

UDP接收

//信号槽设置 connect(udpSocket,SIGNAL(readyRead()),this,SLOT(UDPReceive()));//添加信号与槽的连接,当主机端口接收到数据时readyRead()有效,进而触发跳转到UDPReceive()函数;其中readyRead()为Qt中QIODEVICE类中函数,UDPReceive()是需要自己编写的函数。 //字节读取 while(udpSocket->hasPendingDatagrams()){//判断有数据报接收到 QByteArray datagram; datagram.resize(udpSocket->pendingDatagramSize());//设置字节数组大小 QHostAddress remoteIP;//接收远端IP quint16 remotePort;//接收远端端口号 udpSocket->readDatagram(datagram.data(),datagram.size(),&remoteIP,&remotePort);//读取数据 QString str=datagram.data();//将读取的数据转化为字符串 }

参考文献 《Qt5.9 c++开发指南》王维波著,P400



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3