关于电脑性能,超大数据无法发送与接收,不能发送或者接收超过1000字节字符串问题,怎么用qt修改程序

15 篇文章 0 订阅
3 篇文章 0 订阅

 

目录

 

1、问题:字节数过大,电脑传输不了      

2、拆包

 3、封包


1、问题:字节数过大,电脑传输不了      

最近在项目上遇到一个问题就是,项目上有几台电脑,用udp的工具做测试,如果发送端发送超过1000字节的数据,就发送不出来,同时接收端也接收不到,不知道是驱动问题还是什么问题,也查询了mtu的值,也没办法解决。

      没有办法,只能修改代码了。

      现在提供一种解决办法,就是发送端是群发的,无法直接使用udp拆包分小包发送,现在采用的办法就是redis数据库的频道来解决。

      而对于点对点的程序,一对一发送与接收的程序,则针对udp采用拆包和解包,也就是说将udp按照一定字节拆成小包分几次发送,而接收端就解包把这几个小包合在一起。

2、拆包

拆包的代码:

  // 将QJsonObject转换为QByteArray
    QJsonDocument jsonDoc(sendData);
    QByteArray jsonData = jsonDoc.toJson();

    //分包发送
    int packetSize = 1000; // 每个包的大小,单位字节
    int totalSize = jsonData.size();
    int totalPackets = (totalSize + packetSize - 1) / packetSize; // 计算总包数

    for (int i = 0; i < totalPackets; ++i) {
        QByteArray packet;
        QDataStream out(&packet, QIODevice::WriteOnly);

        out << i << totalPackets; // 包序号和总包数
        packet.append(jsonData.mid(i * packetSize, packetSize)); // 当前包数据
    new_receiver->writeDatagram(packet, remoteAddress, remotePort);
    //qDebug()<<k;
    }

 3、封包

  封包的代码:

   QDataStream in(&datagram, QIODevice::ReadOnly);
         int packetIndex, totalPackets;
         in >> packetIndex >> totalPackets; // 读取包序号和总包数

         QByteArray packetData = datagram.mid(in.device()->pos()); // 读取实际数据

         // 保存接收到的分包数据
         if (!receivedPackets.contains(packetIndex)) {
             receivedPackets[packetIndex] = packetData;
         }

         // 保存预期总包数
         if (totalPacketsExpected == -1) {
             totalPacketsExpected = totalPackets;
         }

         // 如果接收到了所有包,进行重组
         if (receivedPackets.size() == totalPacketsExpected) {
             QByteArray completeData;
             for (int i = 0; i < totalPacketsExpected; ++i) {
                 completeData.append(receivedPackets[i]);
             }
             receivedPackets.clear(); // 清空临时容器
             totalPacketsExpected = -1; // 重置预期总包数


             // 将 QByteArray 转换为字符串
             QString jsonString = QString::fromUtf8(completeData);
             // 解析 JSON 数据
             QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8());

这个反括号需要你自己去打,之后就是处理的过程。

我主要对接都是json数据,导致数据量占得字节数过大,但是按道理不超过65535字节都是可以接收的,多台电脑上显示并没有什么问题,就那几台有问题,也不知道咋回事。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QSerialPort是Qt提供的串口通信类,可以通过该类实现串口数据的发送接收。要发送字节数据和字符串数据,可以使用write()方法。 下面是发送字节数据的代码示例: ```cpp QSerialPort serial; serial.setPortName("COM1"); serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); if (serial.open(QIODevice::ReadWrite)) { QByteArray data; data.append(0x01); data.append(0x02); data.append(0x03); serial.write(data); serial.flush(); serial.close(); } ``` 上述代码中,先创建一个QSerialPort对象,并设置串口参数。然后打开串口,将要发送字节数据依次添加到QByteArray对象中,最后通过write()方法发送数据,通过flush()方法确保数据已经全部发送出去,最后关闭串口。 下面是发送字符串数据的代码示例: ```cpp QSerialPort serial; serial.setPortName("COM1"); serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); if (serial.open(QIODevice::ReadWrite)) { QString str = "Hello World!"; QByteArray data = str.toUtf8(); serial.write(data); serial.flush(); serial.close(); } ``` 上述代码中,先创建一个QSerialPort对象,并设置串口参数。然后打开串口,将要发送字符串转换为QByteArray对象,并通过write()方法发送数据,通过flush()方法确保数据已经全部发送出去,最后关闭串口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值