QT开发中文网

QByteArray packet; packet.append(char(0xCD)); // 协议头 QByteArray nameData; QDataStream nameStream(&nameData, QIODevice::WriteOnly); nameStream

这段代码看起来没有明显的问题,但是当需要发送大量数据时可能会存在一些问题。由于数据量较大,每次写入和读取数据都会占用大量的内存,并且可能导致网络传输延迟增加。

为了避免这些问题,您可以使用QFile对象逐块读取文件内容并将其发送到服务器。在发送之前,可以先确定文件大小,并将其作为包头中的一个字段。接收方在接收到包后也可以根据这个字段来判断是否已经完整地接收了所有的文件内容。另外,在读取和写入数据时最好采用流式处理方式而非一次性处理整个数据块。

下面是一个修改过的示例代码:

QFile file(file_name);
if (!file.open(QIODevice::ReadOnly)) {
    qDebug() << "Failed to open file: " << file.errorString();
    return;
}

// Get the file size
qint64 fileSize = file.size();

// Create the packet
QByteArray packet;
packet.append(char(0xCD)); // 协议头

// Write the name length and name data to the packet
QDataStream nameStream(&packet, QIODevice::WriteOnly);
nameStream << static_cast<quint16>(file_name.length());
packet.append(file_name.toUtf8());

// Write the content length and content data to the packet
QDataStream contentStream(&packet, QIODevice::WriteOnly);
contentStream << static_cast<quint64>(fileSize); // 64-bit size field instead of 32-bit
packet.append(file.readAll()); // Read all data from the file

packet.append(char(0xDC)); // 协议尾

// Send the packet to the server
MyTCP_Client($ip, "2074", packet, 1);

这个修改后的代码将文件大小作为64位整数字段加入到包头中,并使用QFile逐块读取数据,避免了一次性处理大量数据所带来的内存和网络传输延迟问题。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=1908

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?