StreamCorruptedException, при использовании ObjectInputStream - PullRequest
1 голос
/ 02 июня 2010

Мне нужно отправить объект с клиента на сервер, сериализовав его.
Это мой код:

     HttpURLConnection con = null;
     ObjectOutputStream out = null;
     ObjectInputStream inputStream = null;

     URL servlet = new URL("MY_URL");
        con = (HttpURLConnection) servlet.openConnection();
        con.setDoInput(true);
        con.setDoOutput(true);
        con.setUseCaches(false);
        con.setDefaultUseCaches(false);
        con.setRequestProperty("Content-type", "application/octet-stream");
        con.setRequestMethod("POST");
        out = new ObjectOutputStream(con.getOutputStream());
        out.writeObject(myobject);
        out.flush();
        out.close();

        inputStream = new ObjectInputStream(con.getInputStream());
        inputStream.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    finally
    {
    //  inputStream.close();
        con.disconnect();
    }
    return true;

Теперь я могу добраться до сервлета и получить через него объект.
Единственная проблема в том, что как только я доберусь до этой линии:

inputStream = new ObjectInputStream(con.getInputStream());

Я получаю исключение StreamCorruptedException на стороне клиента. (на стороне сервера все работает отлично!) И если я уберу эту строку, сервлет не будет запущен (я имею в виду doGet() или doPost(), не вызываемый в сервлете)

Что я делаю не так?

Это точная ошибка:

06-02 12:41:53.549: WARN/System.err(4260): java.io.StreamCorruptedException
06-02 12:41:53.549: WARN/System.err(4260): java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2399)
06-02 12:41:53.549: WARN/System.err(4260): at java.io.ObjectInputStream.<init>(ObjectInputStream.java:447) 

Спасибо
Ray

Ответы [ 2 ]

4 голосов
/ 02 июня 2010

Клиент ожидает, что сервлет записывает объект в ответ что-то вроде:

ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream());
oos.writeObject(someObject);

Но сервлет, по-видимому, фактически не записывает никаких объектов обратно. Поэтому клиент не должен украшать его ObjectInputStream. Просто сделай так:

InputStream inputStream;
// ...
inputStream = connection.getInputStream();

или просто

connection.connect();

если вы все равно не заинтересованы в ответе. Соединение выполняется только по запросу. getInputStream() сделает это неявно. Вот почему запрос не был запущен, пока вы не позвоните getInputStream(). Также см. этот ответ для получения дополнительных подсказок.

0 голосов
/ 02 июня 2010

Не делайте этого сами, посмотрите на HttpClient и Spring HttpInvoker.

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