QT之udp通信

一、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实现助手但是怎么他自己也接收到了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值