我正在编写一个与我没写过的测试服务器通信的函数。我发送命令,需要在执行任何其他操作之前立即捕获多行响应。当然,我不想阻止我的整个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;
}
但我只能抓住我的四线响应的第一行。
提前致谢!
答案 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)
我们假设服务器逐行发送其响应。
waitForReadyRead()
取消阻止。bytesAvailable
> 0.(此检查是不必要的:如果没有可用的字节,waitForReadyRead()
仍将阻止。)readAll()
读取第一行。bytesAvailable == 0
为什么不使用readLine
?