QT网络通信——较大数据量

本文记录了一位新手博主在使用QTcpSocket进行网络通信时遇到的问题:当数据量超过1435字节时,不能一次性读取所有数据。作者通过多次readyRead事件分批读取并解析JSON数据。文章寻求对解决方案原理的深入理解。
摘要由CSDN通过智能技术生成

新人第一次写博客,记录这个困扰我数天的bug。
背景——QTcpSocket网络通信,当数据量大于1435时,无法在一次readyRead触发后读完全部数据,即使在槽函数里循环读。
解决——在多次readyRead里读完,如下,rh和d和size都是成员变量,分别用于记录是否读了包头,数据内容和包头内容。

connect(skt, &QTcpSocket::readyRead, this, [=]()
{
    qDebug() << "insert recv thread : " << QThread::currentThread();

    if (!rh)
    {
        QByteArray dt;
        dt = skt->read(sizeof(int));
        size = *reinterpret_cast<const int*>(dt.data());
        qDebug() << "the read size is " << size;
        rh = true;
    }

    if (size >= 0)
    {
        if (d.size() < size)
        {
            d.append(skt->readAll());
            qDebug() << d.size();
        }
        if (d.size() < size) return;
        QJsonArray* res = new QJsonArray;
        *res = QJsonDocument::fromJson(d).array();
        emit insert_finish(size, res);
    }
    else
    {
        emit insert_finish(size, nullptr);
    }
    skt->close();
    skt->deleteLater();
    rh = false;
    d.clear();
});

bug虽然解决了,但是原理不太清楚,求教大佬

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值