Qt的network模块实现UDP程序

UDP协议即user datagram protocol 用户数据报协议的英文单词的每一个单词的首字母大写拼接,

UDP协议没有客户端和服务端之分,是传输层协议,面向无连接、不可靠,失败不重传、不排序不检错,具有较高的传输速度和实时性(没有三次握手和四次挥手的过程),常用于视频直播、游戏数据传输和语音通话等实时性要求高的应用场景,并通过ARQ(automatic repeat request)自动重传请求、FEC(forward Error Correction)前向纠错技术等来确保UDP发送的数据的完整性和正确性。

目录

UDP通信的流程图

UDP程序实现

 项目效果图

 其他

exe程序打包


UDP通信的流程图

 使用Qt可以提高开发UDP小程序的效率

UDP程序实现

Qt Creator创建一个UDP.pro工程文件

在pro文件中添加network模块,然后创建widget.h头文件和main.cpp主函数文件、widget.cpp源文件和界面文件widget.ui,共五个文件

 

 UDP.pro

#-------------------------------------------------
#
# Project created by QtCreator 2023-06-24T15:45:28
#
#-------------------------------------------------

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = UDP
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QHostAddress>
#include <QUdpSocket>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    //建立一个发送按钮槽函数
    void on_BtnSent_clicked();

private:
    Ui::Widget *ui;
    QUdpSocket *udpSocket;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QString>
#include <QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->udpSocket=new QUdpSocket(this);//创建一个对象QUdpSocket,赋值给udpSocket,这个udpSocket是Widget的成员变量(this)
//    udpSocket->bind(QHostAddress::AnyIPv4,2425,QUdpSocket::ShareAddress);
    //设置只读
    ui->textEditRecv->setReadOnly(true);
    // 接收广播消息
    connect(udpSocket, &QUdpSocket::readyRead, this, [=]() {
        while (udpSocket->hasPendingDatagrams()) {
            QByteArray datagram;
            datagram.resize(udpSocket->pendingDatagramSize());
            QHostAddress sender;
            quint16 senderPort;
            udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);

            ui->textEditRecv->append(sender.toString());
            ui->textEditRecv->append(datagram);
        }
    });

}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_BtnSent_clicked()
{
    QString content=ui->textEditContent->toPlainText();
//    qDebug()<<content<<endl;
    quint16 port=ui->lineEditPort->text().toShort();
//    qDebug()<<port<<endl;
    udpSocket->writeDatagram(content.toLatin1(),content.length(),QHostAddress::Broadcast,port);

    /*
     案例:1:1:凢曐:凢曐:32:hello
          是飞秋软件使用的一种消息格式,其含义如下:
    1. 第一个 "1" 表示消息类型为普通消息,2 表示文件传输消息,3 表示请求在线用户列表消息等等。
    2. "1:lh" 表示发送方的用户名和主机名。其中,"1" 表示发送方的用户名长度,"lh" 表示用户名为 "lh"。
    3. "lh" 表示发送方主机名,与用户名之间用冒号隔开。
    4. "32" 表示该消息的真实数据长度,即发送方发送的消息内容长度。
    5. "hell" 表示消息内容,长度为 32,其中 "hell" 只是示例,实际内容可能是任何字符串。
    在飞秋软件中,用户可以发送普通消息、文件传输消息、请求在线用户列表消息等不同类型的消息,每个消息都有不同的格式和含义。以上只是其中一种消息格式的解释。
    */
}

widget.ui

 

 项目效果图

 项目描述:这里通过UDP广播向飞秋发送了消息,飞秋接收消息是有格式的,例如:1:1:12:21:32:hello

案例:1:1:凢曐:凢曐:32:hello
          是飞秋软件使用的一种消息格式,其含义如下:
    1. 第一个 "1" 表示消息类型为普通消息,2 表示文件传输消息,3 表示请求在线用户列表消息等等。
    2. "1:lh" 表示发送方的用户名和主机名。其中,"1" 表示发送方的用户名长度,"lh" 表示用户名为 "lh"。
    3. "lh" 表示发送方主机名,与用户名之间用冒号隔开。
    4. "32" 表示该消息的真实数据长度,即发送方发送的消息内容长度。
    5. "hell" 表示消息内容,长度为 32,其中 "hell" 只是示例,实际内容可能是任何字符串。
    在飞秋软件中,用户可以发送普通消息、文件传输消息、请求在线用户列表消息等不同类型的消息,每个消息都有不同的格式和含义。以上只是其中一种消息格式的解释。

 先获取到端口和内容然后通过writeDatagram函数将数据通过UDP协议发送出去

 其他

飞秋软件下载

飞秋FeiQ唯一官网,飞秋2012,飞秋2013正式版官方下载,飞秋官网,飞秋工作室http://www.feiq18.com/

exe程序打包

步骤:

1.将qt的debug改成release,再重新运行,项目中的构建目录要与实际项目目录一致
2、将release目录下的可执行文件.exe的文件复制一份放入其他目录下

3、打开qt的Qt 5.8 for Desktop (MinGW 5.3.0 32 bit)

4、找到放入.exe程序的目录,使用命令windeployqt 可执行文件名字加.exe,这个时候这个.exe就可以直接运行了

5、为了更方便,直接将demo下的所有文件都压缩打包,使用Enigma Virtual Box 软件打包压缩成可执行文件
(https://enigmaprotector.com/en/downloads.html)

5.1、使用Enigma Virtual Box ,
先把.exe文件输入到上方的框中
在add中选择增加文件夹(递归方式),

5.2、在files options中,选择压缩文件compress files

5.3、选择process,执行封包,最后在demo目录下找到boxed.exe的可执行文件,就可以直接运行了。

具体步骤参考我发布的另一篇文章

Qt的network模块实现TCP客户端和服务端_凢曐的博客-CSDN博客TCP协议即英文的简写,transform control protocol 传输控制协议单词的首字母大写拼接而成。TCP协议是传输层协议,具有客户端和服务端,是面向连接(三次握手和四次挥手过程),基于IP协议的可变大小的滑动窗口协议。不支持广播,数据传输失败可以重传,且具有排序检错功能。TCP协议栈应用场景广泛,因其特点,常用于文件传输,保证接收到的文件是完整的和正确的。除此之外还用于邮件发送和接受,确保邮件正确发送正确接受。https://blog.csdn.net/qq_55610255/article/details/131372473?spm=1001.2014.3001.5502最终效果图

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值