目录
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字节都是可以接收的,多台电脑上显示并没有什么问题,就那几台有问题,也不知道咋回事。