【发布时间】:2017-05-23 00:32:23
【问题描述】:
我基于this post 编写了我的 QTcpServer。套接字在前 4 个字节 (qint32) 上插入 QByteArray 的总字节数。一切看起来都很好
服务器:
static inline QByteArray IntToArray(qint32 source);
QByteArray IntToArray(qint32 source) {
QByteArray temp;
QDataStream data(&temp, QIODevice::ReadWrite);
data << source;
return temp;
}
void multisocket::write_socket(const QJsonObject &obj){
QJsonDocument doc(obj);
QByteArray array(doc.toJson());
qint32 size = array.size();
qDebug() << "sending..." << size << array.size();
QByteArray total = IntToArray(size);
socket->write(total);
socket->write(array);
qDebug() << socket->waitForBytesWritten();
}
服务器输出:
write_socket sending... 22299 22299
write_socket true
客户:
在客户端,我创建一个循环并验证总大小。继续接收直到 总计到达:
static inline qint32 ArrayToInt(QByteArray source);
void network_controller::read_all_buffer(){
QByteArray buffer;
qint32 size = 0;
while (s->bytesAvailable() > 0)
{
buffer.append(s->readAll());
while ((size == 0 && buffer.size() >= 4) ||
(size > 0 && buffer.size() >= size)){
if (size == 0 && buffer.size() >= 4)
{
size = ArrayToInt(buffer.mid(0, 4));
buffer.remove(0, 4);
}
if (size > 0 && buffer.size() >= size)
{
QByteArray data = buffer.mid(0, size);
QJsonObject obj = socket_ba_to_json(data);
emit network_callback(obj);
}
}
}
}
问题:在客户端上,第一个字节的大小似乎没问题。我从服务器和客户端收到 22299,但循环不会停止并且缓冲区大小会增加。我错过了什么?
客户端输出:
read_all_buffer Receiving: 22299 1460
read_all_buffer Receiving: 538976288 8760
read_all_buffer Receiving: 538976288 4380
read_all_buffer Receiving: 808192544 1460
read_all_buffer Receiving: 538976288 2920
read_all_buffer Receiving: 1381979713 3323
【问题讨论】:
-
在您的
read_all_buffer中,您的代码第一次会进入两个if块。但其他时候不会。似乎那里出了问题。 -
可能是缓冲区应该被清除。
-
@ShiheZhang 感谢您的回复。我认为问题在于范围。
-
@DiegoDesenvolvedor 您可以考虑将您的解决方案添加为答案(并接受它),而不是将其添加到您的原始问题中。
-
@m7913d 感谢您的提示
标签: qt networking tcp tcpclient tcpserver