QUdpSocket实现UDP通信

转自:https://blog.csdn.net/m0_37357063/article/details/80744011
UDP(User Datagram Protocol, 用户数据报协议) 是轻量的、不可靠的、面向数据报、无连接的协议,它可以用于对可靠性要求不高的场所。UDP发送和接收数据都不需要建立连接,只需要绑定IP地址和端口号就可以了。发送数据直接发送,接收数据需要循环判断数据是否接受完毕。Qt的信号槽机制很好的实现了收到数据发送信号触发处理函数。

QUdpSocket类用于UDP通信,它是从QAbstractSocket继承而来的,所以与QTcpSocket共享大部分的接口函数。主要区别是QUdpSocket以数据报传输数据,而不是连续的数据流。发送数据报使用函数QUdpSocket::writeDatagram(),数据报的长度一般少于512字节,每个数据报包含发送者和接受者的IP地址和端口信息。

要进行UDP数据接收,要用QUdpSocket::bind()函数先绑定一个端口,用于接收传入的数据报。当有数据报传入时会发射readRead()信号,使用readDatagram()函数来读取接收到的数据报。

UDP消息传送有单播、广播、组播三种。
单播模式:一个UDP客户端发出的数据报只发送到另一个指定的地址和端口的UDP客户端,是一对一数据传输
广播模式:一个UDP客户端发出的数据报,在同一网络范围内其他所有的UDP客户端都可以接收到。QUdpSocket支持IPv4广播。广播经常用于实现网络发现的协议。要获取广播数据只需要将数据报发送到特定的接收端地址QHostAddress::Broadcast(255.255.255.255)
组播模式:也称为多播。UDP客户端加入到另一个组播IP地址指定的多播组(QUdpSocket::joinMuliticastGroup()),成员想组播地址发送的数据报组内成员都可以接收到,类似于QQ群的功能。一般即时通信都是基于UDP通信的。
代码实现:
udpsender: sender.h

#ifndef SENDER_H
#define SENDER_H
 
#include <QDialog>
class QUdpSocket;
 
namespace Ui {
class Sender;
}
 
class Sender : public QDialog
{
    Q_OBJECT
 
public:
    explicit Sender(QWidget *parent = 0);
    ~Sender();
 
private slots:
    void on_pushButton_clicked();// 发送数据报
 
private:
    Ui::Sender *ui;
    QUdpSocket *sender;
};
 
#endif // SENDER_H

udpsender: sender.cpp

#include "sender.h"
#include "ui_sender.h"
#include <QtNetwork>
 
Sender::Sender(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Sender)
{
    ui->setupUi(this);
    sender = new QUdpSocket(this);
}
 
Sender::~Sender()
{
    delete ui;
}
 
void Sender::on_pushButton_clicked()
{
    QByteArray datagram = "hello world!";
    //调用writeDatagram函数来发送数据(点对点消息和广播消息都适用)
    sender->writeDatagram(datagram.data(), datagram.size(),
                          QHostAddress::Broadcast, 45454);
 
}

udpreceiver: receiver.h

#ifndef RECEIVER_H
#define RECEIVER_H
 
#include <QDialog>
class QUdpSocket;
namespace Ui {
class Receiver;
}
 
class Receiver : public QDialog
{
    Q_OBJECT
 
public:
    explicit Receiver(QWidget *parent = 0);
    ~Receiver();
 
private:
    Ui::Receiver *ui;
    QUdpSocket *receiver;
 
private slots:
    void processPendingDatagram();// 读取接收到的数据报 
};
 
#endif // RECEIVER_H

udpreceiver: receiver.cpp

#include "receiver.h"
#include "ui_receiver.h"
#include <QtNetwork>
 
Receiver::Receiver(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Receiver)
{
    ui->setupUi(this);
 
    receiver = new QUdpSocket(this);
    // 要实现UDP数据的接收,必须先要bind一个端口,用于监听传入的数据报,解除用about函数.
    receiver->bind(45454, QUdpSocket::ShareAddress);
    // QUdpSocket接收到数据报后发射readyRead()信号,在关联的槽函数processPendingDatagram里读取缓冲区的数据报.
    connect(receiver, &QUdpSocket::readyRead, this, &Receiver::processPendingDatagram); 
}
 
Receiver::~Receiver()
{
    delete ui;
}
 
void Receiver::processPendingDatagram()
{
    // 拥有等待的数据报
    while(receiver->hasPendingDatagrams())
    {
        QByteArray datagram;
 
        // 让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据
        datagram.resize(receiver->pendingDatagramSize());
 
        // 接收数据报,将其存放到datagram中
        receiver->readDatagram(datagram.data(), datagram.size());
        ui->label->setText(datagram);
    }
}
//hasPendingDatagrams表示是否有待读取的传入数据报
//pendingDatagramSize返回待读取数据报的字节数
//readDatagram用于读取数据报的内容.
### 回答1: 要实现Qt中的UDP通信源文件打包下载,可以按照以下步骤进行: 1. 首先,创建一个Qt应用程序工程,并添加所需的UDP通信相关的头文件和源文件。 2. 在Qt的主窗口界面中,设计一个用户界面,包括一个文件选择框和一个下载按钮,用于选择要下载的源文件和触发下载操作。 3. 在代码中,定义一个QUdpSocket对象,用于进行UDP通信。 4. 在下载按钮的信号槽函数中,首先获取用户选择的源文件路径。 5. 然后,使用QUdpSocket对象的writeDatagram函数发送一个请求报文给UDP服务器,请求下载指定的源文件。可以使用协议规定的特定格式进行报文的封装,例如指定一个特定的操作码来表示下载请求。 6. 接下来,使用QUdpSocket对象监听UDP服务器发送回来的文件数据。 7. 在QUdpSocket的readyRead信号的槽函数中,使用readDatagram函数读取UDP服务器发送的数据包,并将其保存到本地。 8. 当接收到UDP服务器发送的文件数据时,可以根据协议规定的格式解析数据,获取文件的内容,并将其保存到本地磁盘的指定位置。 9. 下载完成后,可以弹出一个对话框提示用户下载完成,并根据需要进行后续的操作,例如打开下载的源文件等。 10. 最后,进行错误处理和资源清理的操作,释放相关的资源。 通过以上步骤,就可以实现在Qt中通过UDP通信进行源文件打包下载的功能。在实际使用中,还需要根据具体的需求进行一些调整和优化。 ### 回答2: 实现UDP通信源文件打包下载的方法如下: 首先,我们需要使用Qt框架的网络模块来创建一个UDP通信的客户端和服务端。 客户端: 1. 创建一个QUdpSocket对象来处理UDP报文的发送和接收。 2. 绑定一个本地端口来接收服务端的响应。 3. 使用QFile类打开要下载的源文件。 4. 将文件的内容分割成一定大小的数据包,并使用QUdpSocketwriteDatagram函数将数据包发送给服务端。 5. 监听QUdpSocket的readyRead信号,以接收服务端的响应。 6. 接收服务端发送的数据包,并将其写入一个新文件中。 7. 循环执行步骤6,直到接收到服务端发送的结束标志。 8. 关闭QUdpSocket和QFile对象。 服务端: 1. 创建一个QUdpSocket对象来处理UDP报文的发送和接收。 2. 绑定一个本地端口来接收客户端的请求。 3. 监听QUdpSocket的readyRead信号,以接收客户端的请求。 4. 接收客户端发送的数据包,并将其写入一个文件中。 5. 循环执行步骤4,直到接收到客户端发送的结束标志。 6. 关闭QUdpSocket。 在客户端和服务端之间传输文件时,可以使用文件分片的方式来进行传输和接收,即将文件分割成一定大小的数据包,以提高传输效率和稳定性。当充分利用UDP数据包的大小限制时,可以在一个数据包中传输多个文件分片。 此外,为了确保数据的完整性和准确性,可以在发送的数据包中添加一些校验码或者序列号来进行检验和验证。 需要注意的是,UDP通信是一种不可靠的通信协议,因此在实现源文件打包下载时,客户端和服务端需要遵循一定的通信协议来保证数据的可靠性和一致性。例如,可以在每个数据包中添加一个标志位来指示数据的开始和结束,以及数据包的序号来进行跟踪和验证。 总之,通过使用Qt的网络模块和UDP通信协议,我们可以实现源文件的打包下载功能,并且可以结合一些数据分片和校验机制来提高传输的稳定性和可靠性。 ### 回答3: Qt实现UDP通信源文件打包下载可以通过以下步骤实现: 1. 创建一个Qt项目,引入网络相关的头文件,如QUdpSocket。 2. 在主程序的入口函数中创建一个QUdpSocket对象udpSocket。 3. 设置udpSocket对象的绑定端口号以及绑定地址(如果需要)。 4. 使用udpSocket对象的bind函数将socket与指定的端口号绑定。 5. 连接udpSocket对象的readyRead信号到对应的槽函数,用来接收数据。 6. 在槽函数中使用udpSocket对象的readDatagram函数,读取接收到的数据,存储到本地文件中。 7. 创建一个下载按钮,连接到对应的槽函数。 8. 在槽函数中创建一个QUdpSocket对象downloadSocket。 9. 设置downloadSocket对象的绑定端口号以及绑定地址(如果需要)。 10. 使用downloadSocket对象的connectToHost函数连接到指定的发送端地址和端口号。 11. 在按钮槽函数中使用downloadSocket对象的writeDatagram函数发送请求数据包到发送端。 12. 在槽函数中使用downloadSocket对象的waitForReadyRead函数等待接收数据。 13. 接收到发送端的回复后,使用downloadSocket对象的readDatagram函数读取回复中的文件数据并存储到本地文件中。 14. 下载完成后,关闭downloadSocket对象。 这样就实现了通过UDP通信进行源文件打包下载的功能。注意在发送端需要将源文件按照一定的协议打包成数据包,以便接收端可以正确解析和保存文件。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值