无法从qtcpsocket qt检索多行数据

时间:2015-02-04 19:29:30

标签: asynchronous blocking qtcpsocket qt5.3

我正在编写一个与我没写过的测试服务器通信的函数。我发送命令,需要在执行任何其他操作之前立即捕获多行响应。当然,我不想阻止我的整个UI,这应该不是问题,因为当我发送命令时,响应仅仅是几个标称ms。

话虽这么说,这就是我想出来的:

 QByteArray MainWindow::ask(const QByteArray &cmd) //blocking function. Add     to thread while in use?
 {
      this->consoleWindow->put_data_in_console(cmd);
      this->socket->write(cmd + "\r\n");

      QByteArray resBuffer;
      socket->waitForReadyRead();

      while(socket->bytesAvailable > 0)
      {
           resBuffer.append(socket->readAll());
      }
      return resBuffer;

}

但我只能抓住我的四线响应的第一行。

提前致谢!

2 个答案:

答案 0 :(得分:0)

如果另一端一次发送一行响应,则可能响应多个数据包。在每个数据包之间,您将耗尽可用数据以在套接字上读取,bytesAvailable将返回0.您真正想要的是等待套接字关闭。

我对Qt不太熟悉,但我认为这样的事情就是你想要的:

QByteArray MainWindow::ask(const QByteArray &cmd)
{
    this->consoleWindow->put_data_in_console(cmd);
    this->socket->write(cmd + "\r\n");

    QByteArray resBuffer;
      socket->waitForReadyRead();

    while(socket->isOpen())
    {
        socket->waitForReadyRead(-1);
        resBuffer.append(socket->readAll());
    }
    return resBuffer;
}

如果您想为多个询问/响应建立单一连接,则需要某种魔术分隔符来标记响应的结尾并扫描缓冲区。

答案 1 :(得分:0)

我们假设服务器逐行发送其响应。

  1. 第一行(或者甚至只是其中的一部分,比如一个字节)到达。
  2. waitForReadyRead()取消阻止。
  3. 您的程序进入循环,因为bytesAvailable> 0.(此检查是不必要的:如果没有可用的字节,waitForReadyRead()仍将阻止。)
  4. readAll()读取第一行。
  5. 第二次检查循环条件:bytesAvailable == 0
  6. 方法结束,仅返回第一行。
  7. 为什么不使用readLine