2013-06-27 185 views
0

我想提出一個Android應用程序,併發送XML到一個IP地址。我應該返回一個xml作爲響應,但輸入流緩衝區中的字節總是空的。我正在使用以下代碼:爲什麼InputStream.inAvailable()總是返回0?

String sMessage = "<Server><CONNECT><IP>192.168.1.14</IP><Client_ID>123</CLIENT_GUID></CONNECT></Server>"; 

Socket clientSocket = null; 
clientSocket = new Socket("192.168.252.148",34543); 
PrintWriter pw = new PrintWriter(clientSocket.getOutputStream(),true); 

pw.write(sMessage); 
InputStream in = clientSocket.getInputStream(); 
byte[] buffer = new byte[in.available()]; 
System.out.println("buffer size: "+buffer.length); 

pw.close(); 
in.close(); 
clientSocket.close(); 

任何想法爲什麼我沒有在我的輸入流中獲取字節。提前致謝。

回答

0

我該回去了XML作爲迴應,但字節輸入流緩衝區

也許是這樣,但不是瞬間,這是你的代碼假設什麼。如果有可用的()的正確用法很少,並且這不是其中之一。只是在閱讀中阻止。

1

http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()

InputStream對於類的方法available總是返回0

此方法應該由子類重寫。

嘗試使用BufferedInputStream進行包裝。

BufferedInputStream in = new BufferedInputStream(clientSocket.getInputStream()); 
+0

它不會讓絲毫差別,直到後出現了一個讀,其中有沒有。 – EJP

+0

@EJP我沒有明白。謝謝! –

-1

.available()不能在進程間通信(串行包括)被使用,因爲它僅檢查是否存在在當前過程可用的數據(在輸入緩衝器)。

在串行通信中,當您發送按摩,然後立即打電話available()你將主要得0爲串行端口並沒有針對任何數據回覆。

的解決方案是使用阻塞的read()在一個單獨的線程(具有中斷()來結束它):在一些流(如BufferedInputStream,具有內部緩衝器)

try this Thread interrupt not ending blocking call on input stream read

,一些字節讀取和kept in memory,所以你可以閱讀without blocking the program flow。在這種情況下,available()方法會告訴您緩衝區中保留了多少個字節。

new BufferedOutputStream(clientSocket.getOutputStream())); 
new BufferedInputStream (clientSocket.getInputStream()) 
+0

你的前兩段完全不正確。對於實現檢查內核緩衝區的內容是開放的,並且Socket輸入流的可用方法通過FIONREAD進行。我希望串行或並行端口流做同樣的事情。 – EJP

相關問題