簡體   English   中英

無法從TCP套接字讀取

[英]Cannot read from TCP socket

我有一個使用QT和JAVA服務器的C ++客戶端,並且已成功從客戶端寫入服務器,但是無法從服務器寫入客戶端。 我的代碼:

QString
Client::readTCP ( )
{
    socketTCP->waitForReadyRead();

    QTextStream in (socketTCP);

    return in.readAll() ;
}

// Later on

qDebug() << Client::readTCP();

但是,無論我選擇哪種方法,都無法從服務器獲得響應。 服務器代碼如下:

DataOutputStream  output = new DataOutputStream (SOCKET.getOutputStream());

output.writeBytes ( "myString" );

回答:

之所以起作用,是因為我將in.readAll()更改為in.readLine() ,還是因為我在服務器啟動后等待了幾秒鍾才發送消息。

QTextStream::readAll函數嘗試讀取流的全部內容。 此消息是否是流的全部內容。

如果此消息不是流的全部內容,則不應返回。 如果readAll只指定了返回所有內容的事實,則readAll僅返回流的一部分內容將是一個嚴重的錯誤。

如果這是流的全部內容,則服務器損壞。 如果它沒有關閉套接字,客戶端如何知道它已收到全部內容? 除非有其他指示消息結束的方法,否則必須通過關閉流來指示它,並且您不會顯示服務器正在關閉流。

當我遇到這樣的問題時,我將重復我始終給出的建議-永遠不要實施網絡協議,除非在協議規范中指定該協議。 否則,不可能解決服務器和客戶端不同意的問題,因為無法知道哪一端是正確的。 在這里,服務器和客戶端在如何標記消息的末尾上存在分歧,並且沒有協議規范可供參考,因此無法知道要修復的末尾。

如果您有協議規范,則只需查看解釋如何標記和檢測消息結尾的部分即可。 然后,您可以修復不符合規范的任何一端。 (或者,如果規范沒有說明如何,那么請修訂該規范!顯然,這必須以某種方式發生,而規范的工作就是解釋如何做。)

在Java中,將數據發送到緩沖區后,刷新它。 輸出流具有flush()方法,該方法強制將流中剩余的任何數據寫入/發送。 如果在客戶端使用readAll(),請嘗試該操作。

另外,如果您知道將發送多少數據,則建議使用readLine()。 您可以循環通過in.readLine()直到其為空。 同樣,readLine()將刪除任何\\ n或\\ r \\ n。

我沒有使用Qt的經驗,所以我不能說您是否從套接字正確讀取消息,但是使用Java時,我在發送文本時使用PrintStream的方法println ,而VS C ++ Client可以使用recv很好地接收它。

另外,您可能想檢查數據包是否實際上是使用Wireshark通過套接字發送的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM