UDP协议即user datagram protocol 用户数据报协议的英文单词的每一个单词的首字母大写拼接,
UDP协议没有客户端和服务端之分,是传输层协议,面向无连接、不可靠,失败不重传、不排序不检错,具有较高的传输速度和实时性(没有三次握手和四次挥手的过程),常用于视频直播、游戏数据传输和语音通话等实时性要求高的应用场景,并通过ARQ(automatic repeat request)自动重传请求、FEC(forward Error Correction)前向纠错技术等来确保UDP发送的数据的完整性和正确性。
目录
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的可执行文件,就可以直接运行了。
具体步骤参考我发布的另一篇文章