URL-соединение объектов Inputstream и outputtream - PullRequest
0 голосов
/ 13 марта 2012

Это мой код

URL url = new URL("http://172.16.32.160:8080/epramaan/loginotp");
URLConnection connection1 = url.openConnection();
connection1.setDoOutput(true);

ObjectOutputStream out=new ObjectOutputStream(connection1.getOutputStream());
out.writeObject(send);
out.flush();
out.close();

ObjectInputStream in = new ObjectInputStream(connection1.getInputStream());
String output=(String)in.readObject();
in.close();

//Rest of the code

Как только OutputStream записывает данные в поток, остановит ли выполнение объект InputStream до получения ответа?

Ответы [ 3 ]

1 голос
/ 13 марта 2012

Вы можете использовать InputStream.read (byte []) для чтения всего байтового массива в память (вы можете получить длину массива из заголовка HTTP Content-Length) и использовать URLConnection. setReadTimeout () для тайм-аута, если вы блокируете слишком долго.
Из байтового массива вы можете создать свой объект, создав свой ObjectInputStream поверх ByteArrayInputStream

1 голос
/ 14 марта 2012

Как только OutputStream записывает данные в поток, остановит ли выполнение объект InputStream до получения ответа?

Не совсем так. Открытие InputStream ничего не блокирует и даже не приводит к отправке заголовков запроса. Однако чтение из InputStream сделает обе эти вещи.

Я подозреваю, что настоящая причина ваших проблем в том, что вы получаете сообщение об ошибке от сервера, отличного от сериализованного объекта; например это может быть общая страница ошибки HTML с сервера. Естественно, попытка десериализации этого не удалась.

Правильная процедура:

  1. Создать объект URLConnection.
  2. Установите любые заголовки запроса, которые вам нужны.
  3. Подключите его (или пропустите ... это произойдет неявно).
  4. Открыть и записать в OutputStream.
  5. Закрыть OutputStream.
  6. Используйте getResponseCode(), чтобы увидеть, успешно ли выполнен запрос.
    1. Если это удалось, вызовите getInputStream (), прочитайте и обработайте ответ.
    2. Если это не удалось, вызовите getErrorStream () и обработайте вывод ошибки.
1 голос
/ 13 марта 2012

Я предполагаю, что остановить выполнение Вы имеете в виду блок.

Только что заметил, что вы используете readObject, а не read.Пожалуйста, опишите, какие данные вы читаете / пишете и почему вы используете потоки объектов?

Как вы уже упоминали, вы используете String, я бы предложил использовать метод readFully(byte[] buf).Этот метод блокируется, пока все байты не будут прочитаны.Если у вас есть байтовый массив, из этого байтового массива можно создать String .

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