从QTcpSocket读取时清空缓冲区

时间:2013-09-27 17:37:43

标签: qt qtnetwork qtcore

我正在创建一个简单的线程TCP服务器(基于线程Fortune服务器示例)。我已经将readyRead信号连接到我的readCommand插槽,并且我确认在我远程登录到我的服务器并发送了一个字符串(然后输入)后,readCommand函数触发。

下面的函数输出“在readCommand”一旦我发送字符串HELLO,那么输出“new inBuffer”总是显示为空(“”)。

void FortuneThread::readCommand()
{
    qDebug() << "in readCommand" << endl;
    QDataStream in(tcpSocketPtr);
    in.setVersion(QDataStream::Qt_4_0);
    in >> inBuffer;
    qDebug() << "new inBuffer: " << inBuffer << endl;
    ...
}

如果我打印出tcpSocket-&gt; bytesAvailable(),那么当我通过telnet发送更多字符时,我会看到越来越多的字符。我只是没有将它们从套接字中取出......上面的代码是从Fortune Client示例中复制的,所以我认为它会起作用。我使用QDataStream错了吗?

2 个答案:

答案 0 :(得分:0)

  • 您不应使用QTcpSocket初始化QDataStream。

  • 您应该使用QByteArray QIODevice::readAll()从套接字io设备中读取数据。

  • 您应该使用“&lt;&lt;”将上一个操作的字节数组写入数据流操作

所以,代码看起来应该是这样的:

void FortuneThread::readCommand()
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out << tcpSocketPtr->readAll();
    ...
}

答案 1 :(得分:0)

这些代码可以起作用:

QByteArray res;
res.reserve(m_tcp_socket_ptr->bytesAvailable());
res = m_tcp_socket_ptr->readAll();

qDebug() << res;