2010-06-08 55 views
0

我有一個DataInputStream,由Java中的Socket創建。連接到使用分塊傳輸編碼的簡單Web服務器。 Web服務器實際上在普通瀏覽器中工作。但在我的程序中,我試圖讀取,我讀了第一個字節(大約5kb的數據)。但每次讀取之後都會返回0字節讀取。它是否應該阻止,直到它可以讀取?當DataInputStream一直返回0時是什麼意思?

注意:這通常不會發生。問題出在我連接的服務器上。

而且,這個代碼在這裏所有的回報甚至bytesread ==後假0:

 System.out.println(socket.isClosed()); 
     System.out.println(socket.isInputShutdown()); 
     System.out.println(socket.isOutputShutdown()); 

而且這裏的RESP標題:

HTTP/1.1 200 OK 

Date: Tue, 08 Jun 2010 14:01:01 GMT 

Server: Apache/2.2.11 (Unix) PHP/5.2.10 

X-Powered-By: PHP/5.2.10 

Expires: Thu, 19 Nov 1981 08:52:00 GMT 

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 

Pragma: no-cache 

Keep-Alive: timeout=5, max=100 

Connection: Keep-Alive 

Transfer-Encoding: chunked 

Content-Type: text/html 
+0

我們應該假設你的意思是'ByteArrayInputStream'而不是'ByteInputStream'? – Powerlord 2010-06-08 15:42:30

+0

對不起。其實它是DataInputStream! – Zombies 2010-06-08 15:43:56

+0

這很奇怪...... DataInputStream *的讀取方法應該阻塞。我問的原因是因爲'ByteArrayInputStream'似乎是阻塞讀取規則的例外(它永遠不會阻塞)。 – Powerlord 2010-06-08 15:47:32

回答

-1

你是對的,一個InputStream千萬別在讀取時返回0。它應該阻塞直到有一個字節可用,或者返回-1表示EOF。

你有可能提供測試用例嗎?我以前見過bug like this

+0

我會研究它。這有點難,因爲它也取決於服務器。大多數時候這不會發生。 – Zombies 2010-06-08 15:39:09

+0

這是不正確的,參見上文。如果緩衝區長度爲零或指定長度爲零,則它將返回零。 – EJP 2010-06-08 23:58:49

+0

確實,我並不期待讀取0字節的請求。 – 2010-06-09 22:20:30