Почему OutputStream должен быть закрыт после входного потока в Android - PullRequest
4 голосов
/ 14 марта 2012

Я делаю два последовательных вызова моего сервлета с 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();

Приведенный выше код работает хорошо, потому что я закрыл выходной поток первого соединения после закрытия входного потока.Но если я закрываю выходной поток после отправки объекта, второй входной поток выдает исключение:

java.io.StreamCorruptedException

Почему выходной поток должен быть закрыт после закрытия входного потока?

NOTE
Если кто-то знает фактический ответ или правильную причину, по которой он не работает в Android, ответьте, пожалуйста.До тех пор, пока я не приму ответ, данный EJP - это ошибка в Android.

1 Ответ

4 голосов
/ 15 марта 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...