2012-03-14 33 views
4

我這樣做,從機器人到我的servlet 2個succssive通話關閉:爲什麼要爲OutputStream來的InputStream後的Android

//FIRST CONNECTION 
URL url = new URL("http://172.16.32.160:8080/xyz/check_availability"); 
      HttpURLConnection connection =(HttpURLConnection) url.openConnection(); 
      connection.setDoOutput(true); 
      ObjectOutputStream out=new ObjectOutputStream(connection.getOutputStream()); 

      String a="xya"; 
      String b="xsw"; 
      out.writeObject(a); 

      out.flush(); 


      ObjectInputStream in=new ObjectInputStream(connection.getInputStream()); 
      String s=(String) 
      in.readObject(); 
      in.close(); 
      out.close(); 

       Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_LONG).show(); 


      //SECOND CONNECTION 


      URL url1 = new URL("http://172.16.32.160:8080/xyz/check_availability"); 
      HttpURLConnection connection1 = (HttpURLConnection)url1.openConnection(); 
      connection1.setDoOutput(true); 


      ObjectOutputStream out1=new ObjectOutputStream(connection1.getOutputStream()); 
      out1.writeObject(b); 
      out1.flush(); 

      ObjectInputStream in1=new ObjectInputStream(connection1.getInputStream()); 
       String str=(String) 
       in1.readObject(); 
       in1.close(); 
       out1.close(); 
       Toast.makeText(getApplicationContext(), "2", Toast.LENGTH_LONG).show(); 

上面的代碼效果很好,因爲我已經關閉了第一連接的OutputStream關閉輸入流後。但是如果我在發送對象後,要關閉的OutputStream,而第二輸入流拋出異常:

java.io.StreamCorruptedException 

爲什麼要OutputStream的被關閉的InputStream後關閉?

注意
       如果有人知道實際的答案或正當理由,爲什麼它不能在Android中運行,       請回答。直到那時我會接受EJP給出的答案 - 它是android中的一個錯誤。

+0

已經給出了正確的理由。 'Android中的錯誤'。鑑於事實,並且鑑於它在JRE中工作,沒有其他可能的解釋。 – EJP 2012-05-08 12:24:35

+0

@EJP:是的,這是一個像你說的錯誤。我的意思是這個錯誤的原因是什麼。我的意思是,當outputstream關閉或其他事情發生時,android會關閉連接。 – Ashwin 2012-05-09 04:47:32

+0

「輸出流關閉時android是否關閉連接」。是的,顯然。 – EJP 2012-05-09 10:34:18

回答

3

看起來像Android中的一個bug給我。

在Java中,在這種情況下,在HttpURLConnection之後的任何時候關閉ObjectOutputStream都不會做任何事情,除非刷新輸出(因爲連接必須保持接收響應)。關閉HttpURLConnection的輸入流會關閉整個連接,因此ObjectOutputStream的後續關閉將不會執行任何操作。

我懷疑Android首次執行ObjectOutputStream.close()時會對連接造成不良影響,例如關閉它。

我會完全省略ObjectOutputStream.close(),在任何平臺上都不需要它。 flush()就足夠了。

+0

你是否也曾經在andriod中體驗過這一點? – Ashwin 2012-03-15 04:24:22

+0

@ user1139023我從你報告的行爲和我對Java(TM)平臺的瞭解中推斷出它。 – EJP 2012-03-15 05:20:59

+0

你說得對。在java中執行的相同代碼不會給出任何異常並且運行良好。 – Ashwin 2012-03-15 06:30:53

相關問題