2013-09-27 170 views
1

我正在创建一个简单的线程化TCP服务器(基于Fortune服务器线程示例)。我已将readyRead信号连接到readCommand插槽,并确认readCommand函数在telnet到我的服务器并发送字符串(后跟enter)后触发。从QTcpSocket读取时的空缓冲区

下面的函数在发送字符串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是否错误?

+0

我不知道米歇尔,但你为什么要使用“QDataStream :: Qt_4_0" 。你正在使用哪个Qt版本?另外,tcp socket是FortuneThread的一个类成员吗? – lpapp

+0

发送数据时是否看到正确的长度,而不是检查其是否正在增长? – lpapp

+0

我直接从他们的例子中复制了Qt_4_0 ...但我不认为这很重要,因为另一端(客户端)不是编码,只是通过telnet发送字符。如果我从telnet客户端连接,输入HELLO并输入,字节数将增长到7(我认为这意味着我的客户端发送了/ n/r,或者最后可能是空值?)。 – TSG

回答

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

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

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

所以,代码应该是这个样子:

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

我想你在这里。我删除了QDataStream,现在可以访问这些字符。我认为你的解决方案比我想象的要复杂一些,但是谢谢。 – TSG

+0

@米歇尔:不客气。 :-) – lpapp

0

像这样的代码将工作:

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

qDebug() << res;