0

我正在编写一个函数来与我没有编写的测试服务器进行通信。我发送了一个命令,并且需要在执行任何其他操作之前立即捕获多行响应。当然,我不想阻止我的整个 UI,这不应该是一个问题,因为当我发送命令时响应只落后了几个名义上的毫秒。

话虽如此,这就是我想出的:

 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;

}

但我只能捕捉到我的四行响应的第一行。

提前致谢!

4

2 回答 2

0

让我们假设服务器逐行发送它的响应。

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

你为什么不使用readLine

于 2015-02-16T18:09:01.397 回答
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;
}

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

于 2015-02-16T16:15:22.913 回答