2

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

一旦我发送字符串 HELLO,下面的函数就会输出“In readCommand”,然后输出“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->bytesAvailable(),那么当我通过 telnet 发送更多字符时,我会看到越来越多的字符。我只是没有把它们从套接字中取出……上面的代码是从 Fortune Client 示例中复制的,所以我认为它会起作用。我使用 QDataStream 错了吗?

4

2 回答 2

1
  • 你不应该用 QTcpSocket 初始化你的 QDataStream。

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

  • 您应该使用“<<”运算符将前一个操作的字节数组写入数据流。

因此,代码应如下所示:

void FortuneThread::readCommand()
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out << tcpSocketPtr->readAll();
    ...
}
于 2013-09-27T21:13:33.797 回答
0

像这样的代码会起作用:

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

qDebug() << res;
于 2017-04-06T02:26:24.163 回答