2012-03-14 2 views
4

Я делаю два succssive звонки на мой сервлет от андроида таким образом:Почему OutputStream быть закрыт после того, как InputStream в андроида

//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

+0

@EJP: Да, это ошибка, как вы сказали. Я имел в виду, в чем причина этой ошибки. Я имею в виду, что андроид закрывает соединение, когда выходной поток закрыт или что-то еще происходит. – Ashwin

+0

«андроид закрывает соединение, когда выходной поток закрыт». Да, видимо. – EJP

ответ

3

Похож на ошибку в Android для меня.

В Java, откуда это происходит, закрытие ObjectOutputStream в любое время по HttpURLConnection ничего не делает, кроме как сброс вывода (потому что соединение должно оставаться в силе, чтобы получить ответ). Закрытие входного потока HttpURLConnection закрывает все соединение, поэтому последующее закрытие ObjectOutputStream ничего не сделает.

Я подозреваю, что Android делает что-то плохое для соединения, когда вы делаете ObjectOutputStream.close() прежде всего, например, закрывая его.

Я вообще не буду опускать ObjectOutputStream.close(), вам это не нужно ни на одной из платформ. Достаточно flush().

+0

Вы также испытали это в andriod? – Ashwin

+0

@ user1139023 Я выводил его из поведения, о котором вы сообщали, и моего знания платформы Java (TM). – EJP

+0

Вы правы. Тот же код, выполненный в java, не дает никаких исключений и работает хорошо. – Ashwin