2014-01-12 98 views
1

我發現了一個奇怪的問題,在一個循環即讀一個BufferedReader和永遠不會結束......問題與環路和BufferedReader

這是代碼:

BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

int b; 
      StringBuilder buff = new StringBuilder(); 
      while ((b = in.read()) != -1) { 
       buff.append((char) b); 
      } 
      System.out.println(buff.toString()); 

但從來沒有到達的最後一行打印buff.toString()。 這段代碼有什麼問題嗎?

謝謝。

+0

你在讀什麼? (什麼是'in'?) – haraldK

+0

這段代碼正在接收來自瀏覽器(使用套接字)的HTTP消息,我只想打印GET或POST消息的內容以查看內容(標題...您知道) – user2994057

回答

0

你可以嘗試改變這樣的條件嗎?

while ((b = in.read()) > -1) { 
      buff.append((char) b); 
     } 
+0

嗨Binish,我試過但沒有運氣... – user2994057

+0

當你檢查數據不可用時in.ready()的返回值。 –

+0

嗨,這是我得到了什麼打印變量b和in.ready()的內容:10 真正真正假 – user2994057

0

你的循環正在努力讀書,直到EOF(即輸入流的/讀卡器返回-1爲read()方法的唯一原因)。

問題是您的HTTP連接(和您的套接字)可能會保持打開狀態(一段時間),同時也會打開您的輸入流/讀取器。因此,不要達到循環的最終條件,in.read()調用將會阻塞,等待輸入。

如果您控制連接的「另一側」,您可以關閉它,看看會發生什麼。但是我懷疑這對一般用例是否有效。相反,您需要根據HTTP協議解析消息(請參閱HTTP/1.1 RFC2616)。

如果您只需要解析標題,那麼您可以使用BufferedReader,只讀全行,直到找到空行。這將起作用,因爲HTTP在每個標題名稱/值對之後使用換行符(在這種情況下換行符是CRLF),並且只用兩個換行符結束標題部分。之後的一切將成爲消息體。 PS:這是簡單/快樂的情況。請注意,單個連接/套接字可以重複用於多個HTTP請求/響應。您也可以根據您的要求處理此問題。