Asynchronous 无法从qtcpsocket qt检索多行数据

Asynchronous 无法从qtcpsocket qt检索多行数据,asynchronous,blocking,qtcpsocket,qt5.3,Asynchronous,Blocking,Qtcpsocket,Qt5.3,我正在编写一个与我没有编写的测试服务器通信的函数。我发送了一个命令,需要在执行任何其他操作之前立即捕获多行响应。当然,我不想阻塞我的整个UI,这应该不会是一个问题,因为当我发送命令时,响应只落后几毫秒 话虽如此,这就是我想到的: QByteArray MainWindow::ask(const QByteArray &cmd) //blocking function. Add to thread while in use? { this->consoleWi

我正在编写一个与我没有编写的测试服务器通信的函数。我发送了一个命令,需要在执行任何其他操作之前立即捕获多行响应。当然,我不想阻塞我的整个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;
}

但我只能捕捉到我四行回复的第一行


提前谢谢

如果另一端一次发送一行响应,则响应可能来自多个数据包。在每个数据包之间,您将耗尽可用数据以在套接字上读取,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;
}

如果您想为多个请求/响应建立一个连接,则需要某种神奇的分隔符来标记响应的结束,并扫描缓冲区中的响应。

假设服务器逐行发送响应

第一行,甚至可能只是它的一部分,比如说,一个字节到达。 waitForReadyRead解除阻止。 您的程序进入循环,因为bytesAvailable>0。此检查是不必要的:如果没有可用字节,waitForReadyRead仍将阻塞。 readAll读取第一行。 第二次检查循环条件:bytesAvailable==0 方法结束,只返回第一行。
为什么不使用readLine?

从这里过来,我要说的和那边一样:你需要有某种分隔符或任何东西,当响应结束时,它会在接收方告诉你。服务器使用哪种协议?它是TCP,它来自一台测试机器,所以我不知道数据包的确切格式。我打算在ask函数中向服务器询问一个问题,并立即返回结果,结果将由多行可变的ascii文本组成,每行以\r\n或\r\n结尾。我会知道有多少行的回应。我已经成功地异步捕获了服务器在每个readyRead信号上发送的每一行,但是我需要在ask函数中,而不是在onReadyRead类型的插槽中,捕获问题命令之后的所有行。谢谢你为什么不直接用Wireshark或tcpdump来查看通过电线的东西?然后你不必猜测,你可以相应地修改你的代码