新人第一次写博客,记录这个困扰我数天的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虽然解决了,但是原理不太清楚,求教大佬