2012-10-06 93 views
0

我正在從我從套接字的服務器端接收到的輸入流中讀取數據。我不知道我的回答的大小將是什麼方式,我讀入一個字節數組這是代碼輸入流中的無限循環

public static String readString(InputStream inputStream) throws IOException { 

    ByteArrayOutputStream into = new ByteArrayOutputStream(); 
    byte[] buf = new byte[4096]; 
    for (int n; 0 < (n = inputStream.read(buf));) { 
     System.out.println("Got to this point n is "+n); 
     into.write(buf, 0, n); 
    } 
    into.close(); 
    System.out.println("passed this point"); 
    return new String(into.toByteArray(), AddATudeMessage.CHARENC); 
} 

寫信跟11和235獲得打印到控制檯的數字,所以我假定服務器仍然將輸出寫入輸入流。但它在235被卡住,沒有什麼可以發生。我嘗試暫停主執行線程長達20秒,此時我從服務器接收到241個字節,然後同一無限循環再次發生任何人知道發生了什麼

回答

2

您的代碼結構的方式,它只能在服務器關閉套接字時才能工作。否則,你的一方永遠不會知道服務器是完成還是僅僅很慢(或者有網絡擁塞)。

只有兩種方法來解決這個問題:

  1. 已在服務器首先發送預期的長度,然後停止閱讀,當你接收的字節指定數量的繼續。
  2. 讓服務器在完成時發送一個特殊的數據序列,某種類型的EOF標記不會在正常數據中出現,您可以在沒有更多數據時查找這些標記。

使用available()的解決方案不正確,因爲如果接收緩衝區當前爲空,但仍有數據正在傳輸,則它可返回零。

+0

@crazycasta服務器沒有關閉套接字,我不得不檢查是否有行尾字符,然後我停止閱讀 – sola

0

inputStream.read(buf)inputStream.read(buf)直到服務器關閉纔會返回0套接字(或者可能是一些元數據包的特殊情況)。

0

考慮使用int available()(InputStream)
它返回可以從該輸入流讀取(或跳過)的字節數,而不會被該輸入流的下一個調用者方法阻塞。

-1

int InputStream.read()會阻塞,直到它從套接字接收數據,接收流序列的結尾或引發異常。

考慮使用這樣的說法:

for (; inputStream.available() > 0;) 

在這種情況下,如果在插座上沒有可用的數據,for循環結束和程序可以繼續。當然,你將不得不調整你的代碼來做你想做的事情。