一、UDP通信
udp通信被认为是不可靠的通信因为其不关心数据有没有成功发送,它只需要知道对方的ip地址以及端口号即可发送数据,在udp协议中没用服务器和客户端的概念。
二、UDP通信在QT实现的流程
我们只需要知道udp通信的发送需要什么东西和接受数据需要什么东西即可知道如何实现
接收数据:
在接收数据之前我们需要绑定好自己的端口号这样别人才可以找到自己,接收数据的时候会收到readyRead()的信号,因此我们只需要在打开串口后就将readyRead()信号关联到读数据的槽函数即可
发送数据:
发送数据之前我们需要确定好发送目标的端口以及ip地址
三、UDP通信的UI设计
接收窗口:Plain Text Edit
其他输入框:Line Edit
按钮 :Push Button
标注:Label
横着的水平布局,竖着的垂直布局,整体栅格布局,出现混乱的时候设置ui的最小宽度最小高度
四、UDP通信的逻辑设计
准备工作:我们需要用到QUdpSocket因此我们需要在.pro文件QT中加入network
还要去.h文件加入对应头文件
#include <QUdpSocket>
并在public中定义
QUdpSocket *udpSocket;
1.开启按钮槽函数
开启按钮点击后我们应该将本地的端口进行绑定,这样我们才可以接收到数据
void Widget::on_openbt_clicked()
{
if(udpSocket -> bind(ui->localportedit->text().toUInt()) == true)
QMessageBox::information(this, tr("information"),tr("open success!"),QMessageBox::Save);
else
QMessageBox::information(this, tr("information"),tr("open error!"),QMessageBox::Save);
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot()));
}
这里我们是将端口号转化为unsigned int类型绑定起来,并连接接收数据信号的槽函数
使用hasPendingDatagrams判断是否有数据来了,如果有则定义了QByteArray类型的data,先设置了打他的大小(就是来了的数据的大小),然后使用 readDatagram接收数据,最后需要把数据转换为QString 类型的数据才可以显示。
整体流程:判断是否有数据->初始化数据大小->接收数据->转换数据类型->显示
//接受数据的时候只需要设置好自己的本地端口号即可
void Widget::readyRead_slot()
{
while(udpSocket ->hasPendingDatagrams())
{
//创建数据存储容器,并设置长度为将接收的数据长度
QByteArray data;
QString byte;
data.resize(udpSocket->pendingDatagramSize());
//读取数据并保存信息发送者的地址和ip(方便发送时指定发送位置)
udpSocket->readDatagram(data.data(), data.size());
byte = data.data();
ui -> receiveedit ->appendPlainText(byte);
}
}
2.关闭按钮槽函数
void Widget::on_closebt_clicked()
{
QMessageBox::information(this, tr("information"),tr("close error!"),QMessageBox::Save);
udpSocket ->close();
}
3.发送按钮设计
当我们点击发送按钮前我们需要确定三件事
1.目标ip是什么? 2.目标端口是什么? 3.发送的数据是什么?
因此我们分别确定
void Widget::on_sendbt_clicked()
{
quint16 port;
QString sendbuf;
QHostAddress targetaddress;
//设置目标ip 内容 端口号
targetaddress.setAddress(ui ->targetipedit->text());
sendbuf = ui ->sendedit->text();
port = ui->targetportedit->text().toUInt();
//发送的数据 发送的长度 发送的目标ip 目标端口
udpSocket ->writeDatagram(sendbuf.toLocal8Bit().data(),sendbuf.length(),targetaddress,port);
}
QHostAddress targetaddress;定义了地址类型变量,通过setAddress来设置地址(目标地址就在我们的输入框内)
quint16 port;是端口号,其也是在输入框内但是需要转化为unsigned int类型
QString sendbuf;是发送的数据
最后通过writeDatagram来实现其参数分别是(发送数据,toLocal8Bit是一个 Qt 对字符串进行编码转换的函数,其作用是将 Unicode 编码的字符串转换为本地的 8 位编码格式)(发送数据长度)(目标地址)(目标端口)
五、结果
出现了一个问题就是串口调试助手发消息会给qt实现助手但是怎么他自己也接收到了