2013-09-27 214 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;