2013-01-22 54 views
-1

以下是我的方法,其中我將其作爲參數java.net.Socket傳入:getInputStream()。從java.net.Socket讀取InputStream有時會阻止

這在幾乎所有的時候都能很好地工作。當從插槽輸入流是空字節(歧義數據)的一大塊發生

問題。這使得我的程序完全停止響應。有誰知道發生了什麼事?我應該不會得到IOException或什麼,而不是停止響應?我如何才能退出閱讀,如數據是一些無用的模糊信息。

public static String fromStream(InputStream in) throws IOException 
{ 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
    StringBuilder out = new StringBuilder(); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     out.append(line); 
    } 
    return out.toString(); 
} 
+5

你能描述*完全*崩潰是什麼?你有沒有診斷? –

+0

沒有線程在事件發生後才停止響應...我所知道的是,我在這種情況下閱讀的數據是一個非常非常非常(太)長的空字節(或字節'00')。 –

+1

建議您在每100個讀取行和「while」循環後添加打印輸出 – Andremoniy

回答

1

的$ 64,000個問題是什麼這種「無意義的曖昧數據」?

如果它是真正意義的,那麼你真的應該集中於爲什麼被髮送它。有可能是由於發送數據的應用程序中存在錯誤而導致的。找到並解決這個問題,並且不需要更改客戶端代碼。

在另一方面,它可能是有意義的數據...但你/你的應用程序不知道這意味着什麼。在這種情況下,根本問題是文件不是文本文件,因此使用Reader/BufferedReader來讀取它是不正確的。

如果您想堅持嘗試以文本的形式讀取此數據......以零字節/字符不會導致您的悲傷的方式進行讀取,那麼您需要從BufferedReader一次讀取一個字符。當你遇到一個零字符(或不好的字符)時,你的字符閱讀代碼可以被救出。否則,如果你真的需要將非壞字符組合成行。


有一對夫婦的事情,從您的評論請注意:

我基本上只是預期的正常反應如其中包括200個,即來自HTTP服務器的OK,在這種特殊情況下,我得到這些零字節,而沒有其他任何東西。

首先,它聽起來像你可能會嘗試使用普通插座一個HTTP服務器進行交互。這是一個壞主意。 A 真的不好主意!有可能你的普通套接字代碼將無法正確解釋猶太HTTP服務器可以發送響應的各種不同方式。 (這可以解釋以下...)

其次,HTTP響應包含一個「內容類型」,讓你的東西在響應主體的媒體類型。如果您的客戶端忽略了Content-type標頭,那麼您有可能以錯誤的方式處理響應主體。例如,你可能會得到一個PDF文件或一個可能包含大量零字節的TAR文件。

在另一方面,你可以做這些事情的正確方法,以及HTTP服務器可能只是打破。

+0

輝煌,謝謝!我基本上只是期待正常的迴應,例如其中包括200個,即來自HTTP服務器的OK,在這種特殊情況下,我得到這些零字節,而沒有其他任何東西。 –

4

如果流包含'00'個字節,則可能是使用readLine()讀取數據時出錯。你應該讀取字節。