qt widgets UDP稳定接收大数据

今天主要分享一下网络的UDP通信,如何实现UDP收到数据 之后,稳定高效的把收到的所有数据存起来去分析使用,正常网上一搜是有很多qt udp通信的例程,本来我不想写个博来说 这个,但是在简单的移植一个udp例程后,发现仍然有很多问题,所以我发一版经我测试稳定的udp之大数据传输。

 

话不多少上代码:

pro文件中包含 network

头文件包含#include <QUdpSocket>

.h中包含

private slots:
    void send_slot();
    void recv_slot();
private:
    QUdpSocket *udpSocket;

.cpp

#include "mythread.h"
#include <QWaitCondition>
#include <QNetworkInterface>
#include <QHostInfo>
QString bb;
MyThread::MyThread(QObject *parent)
{
    //初始化UDP
    udpSocket = new QUdpSocket;
    udpSocket -> bind(QHostAddress::AnyIPv4,2050);
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(recv_slot()));

}
MyThread::~MyThread()
{
    udpSocket->close();//线程退出关闭udp连接
}
void MyThread::run()
{
    //获取本机ip,通过槽函数传递给主界面显示
    QString localHostName = QHostInfo::localHostName();
    qDebug() <<"localHostName: "<<localHostName;
    QHostInfo info = QHostInfo::fromName(localHostName);

    qDebug() <<"IP Address: "<<info.addresses();
    foreach(QHostAddress address,info.addresses())
    {
         if(address.protocol() == QAbstractSocket::IPv4Protocol)
         qDebug() << address.toString();
         bb=address.toString();
    }
    qDebug()<<bb;
    while (1) {
    
        sleep(1);
  
    }
}

void MyThread::start(QThread::Priority priority)
{
    QThread::start(priority);
    qDebug()<<"==============thread已启动==========";
}
void MyThread::send_slot()
{
    qDebug()<<"in send_slot";
    QString str = "222222222222";
    udpSocket -> writeDatagram(qPrintable(str),4096,QHostAddress::AnyIPv4,8000);
}

void MyThread::recv_slot()
{
    while (udpSocket->hasPendingDatagrams()) {
       QByteArray data;
       data.resize(udpSocket->pendingDatagramSize());
       for(int i=0;i<data.count();i++){
           data[i]=0;
       }
       udpSocket -> readDatagram(data.data(),data.size());
       qDebug()<<data.toHex();
    }

}

以上代码是udp配置部分,之前就是因为配置部分代码没有写的完美,导致发送一些数据总会多一个字节或者多几个字节,数据对应不上,如上修改完之后,未在出现这种问题,经反复测试还是很稳定的,处理好接收数据后我是把数据传到一个自定义方法中,在里面将网络发送的 几千个字节拆分到一个数组中,然后通过数组去 处理合并字节,最总获取到需要的数据信息,这块就不分享了,很容易实现。

传输效果图:

2019年5月24日10:01:16 后台放个10分钟,发送是定时间隔1ms发送

2019年5月24日10:06:03 不等了,时间太紧,换个闲的电脑测试,回头发上测试结果,下面的是5分钟后

测试了3个小时,结果如下

数据达到了10亿,网络助手已经显示不出发送多少个数据了,再继续测下去没有啥意义了,不测了就这样把

以下是一个简单的 Qt UDP 接收端限制接收速度的完整代码示例: ```cpp #include <QtWidgets> #include <QUdpSocket> class UdpReceiver : public QWidget { Q_OBJECT public: UdpReceiver(QWidget *parent = nullptr) : QWidget(parent) { setWindowTitle(tr("UDP Receiver")); // 创建 UDP socket udpSocket = new QUdpSocket(this); // 绑定 UDP socket 到本地端口 udpSocket->bind(QHostAddress::Any, 1234); // 设置接收缓冲区大小 udpSocket->setReadBufferSize(64 * 1024); // 开始接收数据 connect(udpSocket, &QUdpSocket::readyRead, this, &UdpReceiver::processPendingDatagrams); // 创建定时器,限制接收速度 receiveTimer = new QTimer(this); receiveTimer->setInterval(1000); // 每秒接收一次数据 connect(receiveTimer, &QTimer::timeout, this, &UdpReceiver::startReceiving); receiveTimer->start(); } private slots: void processPendingDatagrams() { while (udpSocket->hasPendingDatagrams()) { QByteArray datagram; datagram.resize(udpSocket->pendingDatagramSize()); udpSocket->readDatagram(datagram.data(), datagram.size()); // 处理接收到的数据 // ... receivedBytes += datagram.size(); receivedDatagrams++; } } void startReceiving() { // 停止接收数据 udpSocket->disconnectFromHost(); // 输出接收速率 qDebug() << "Received" << receivedBytes << "bytes in" << receivedDatagrams << "datagrams (" << receivedBytes / receiveTimer->interval() << " B/s)"; // 重置接收计数器 receivedBytes = 0; receivedDatagrams = 0; // 开始接收数据 udpSocket->connectToHost(QHostAddress::Any, 1234); } private: QUdpSocket *udpSocket; QTimer *receiveTimer; qint64 receivedBytes = 0; qint64 receivedDatagrams = 0; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); UdpReceiver receiver; receiver.show(); return app.exec(); } #include "main.moc" ``` 此代码创建了一个 `QUdpSocket` 对象,并将其绑定到本地端口 `1234` 上。使用定时器限制接收速度,每秒最多接收一次数据。当接收到数据时,会输出接收速率,并重置接收计数器,以便下一个时间段内重新计算速率。 请注意,此示例中限制接收速度的方法是简单地断开并重新连接UDP 服务器,这可能会导致一些数据包丢失。更可靠的方法是在读取数据之前使用 `QUdpSocket::waitForReadyRead()` 等待足够的数据可用,以便在限制速率的同时保持接收所有数据。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桶矿泉水

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值