【问题标题】:QTcpServer - Client receiving strange data sizeQTcpServer - 客户端接收到奇怪的数据大小
【发布时间】: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


【解决方案1】:

解决方案:

显然是关于范围的。将大小和缓冲区移动到标头并在数据完成后清除解决了问题。

标题:

private:
 void write_socket(QJsonObject obj);
 QByteArray buffer;
 qint32 size;

来源:

void network_controller::read_all_buffer()
{
   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);
           size = 0;
           buffer = QByteArray();
           emit network_callback(obj);
        }           
    }
}

}

【讨论】:

    【解决方案2】:

    似乎 read_all_buffer 被多次调用以获取服务器的一个答案。尝试将 buffersize 移动到 network_controller 的字段中,并在发出 network_callback 后清理它。

    【讨论】:

    • 你是对的!我将缓冲区和大小移动到标题。在此之后,我已经清理了两个。为什么会这样?
    猜你喜欢
    • 2015-05-26
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多