Qt实现TCP发送文字时封装发送数据出现问题

项目场景:

通过Qt(6.1)的network模块实现TCP发送文字,在本地测试封装TCP包头功能。

问题描述

不对发送数据进行封装时,可正常收发。通过QDataStream来封装待发数据,其中在发送数据前加入quint32类型来存待发送数据的字节大小,接收端进行相应处理后,未能正确收到数据。
//部分TCP发送数据函数
		QString msgInput = "TXT:" + ui->textInput->toPlainText();
        //封装包头 加上数据大小
        QByteArray dataSend;

        QDataStream stream(&dataSend,QIODevice::WriteOnly);
        stream << (quint32)0 << msgInput.toLocal8Bit();
        stream.device()->seek(0);
        //调试大小
        qDebug() << dataSend.size();
        stream << dataSend.size();
        //调试发送内容
        qDebug()<<dataSend;
        //QTcpSocket *client
        client->write(dataSend);

//部分TCP接受函数
    //发送信号对象obj 转为QTcpSocket
    QTcpSocket *socket = qobject_cast<QTcpSocket*>(obj);

    //当前缓冲区数据的大小,收到的数据大小
    qint64 sizeNow = 0;
    do
    {
        //通过bytesAvailable获取当前收到的有效数据大小
        sizeNow = socket->bytesAvailable();
        if(sizeNow < sizeof(quint32))
        {
            return;
        }
        QDataStream stream(socket);
        quint32 sizePack = 0;
        stream >> sizePack;
        //调试 接受缓存数据大小  和Pack数据大小
        qDebug() << sizeNow << "-" << sizePack;
        //包不完整返回
        if(sizeNow < sizePack - 4)
        {
            return;
        }
        qDebug() << "full pack";
        QByteArray datafull;
        stream >> datafull;
    }while(sizeNow >0);

原因分析:

不知道为啥,调试时在发送端显示发送内容为
发送端调试信息,第一个为发送数据大小,第二个为发送数据内容
接收端只能正常接受到大小值 12,“TXT:” 内容则丢失。
“TXT:” 前应该是封装进去的quint类型的值,此时应该是12才对,弄不懂,那个大神到时能给我解惑下,代码我是参考网上的,他的环境是Qt5.5.1。我反复看了很多遍,就是一样的代码出来效果不一样,不知道是不是环境有差异。


解决方案:

在反复查看调试信息中,发现接受端有时能接受到数据,有时会打印空格换行等,我就更改了保存数据字节大小的类型 从quint32改为quint64,对应接收端也改为相应类型,然后就成功接受到数据,在调试信息中也出现了些困惑。
	//原为quint32
	stream << (quint64)0 << msgInput.toLocal8Bit();

修改后发送端的调试信息,其中10表示16字节,04表示“TXT:”4字节
跟32位quint不同 64位为什么出现了10和04,分开的统计结果。
这个为记录贴,也希望有大神能给我解释下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Qt编写代码对文件数据进行TCP帧的封装打包并发送,可以按照以下步骤进行: 1. 打开文件并读取数据。 2. 将数据进行分包处理。根据TCP协议,一个数据包应该包含数据长度、校验和、数据本身等内容。 3. 使用Qt提供的网络编程类,如QTcpSocket类,建立TCP连接。 4. 调用QTcpSocket类中的write()函数,将分包后的数据发送到对方主机。 5. 监听QTcpSocket类的readyRead()信号,当有数据到达,触相应的槽函数进行数据接收。 6. 接收到数据后,进行解包处理,还原出原始数据。 下面是一份示例代码: ```cpp // 打开文件并读取数据 QFile file("test.txt"); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "Open file failed"; return; } QByteArray fileData = file.readAll(); file.close(); // 数据分包 const int packetSize = 1024; int packetCount = fileData.size() / packetSize + 1; for (int i = 0; i < packetCount; ++i) { int offset = i * packetSize; int dataSize = qMin(packetSize, fileData.size() - offset); QByteArray packet; QDataStream stream(&packet, QIODevice::WriteOnly); stream << dataSize; stream << fileData.mid(offset, dataSize); // 发送数据包 socket.write(packet); } // 监听数据接收 connect(&socket, &QTcpSocket::readyRead, [=]() { while (socket.bytesAvailable() > 0) { QByteArray packet = socket.readAll(); QDataStream stream(&packet, QIODevice::ReadOnly); int dataSize; stream >> dataSize; QByteArray data; stream >> data; // 解包并处理数据 // ... } }); // 建立TCP连接并发送数据 socket.connectToHost("127.0.0.1", 1234); if (socket.waitForConnected()) { qDebug() << "Connected to host"; } else { qDebug() << "Connect to host failed"; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值