rayman
rayman

Reputation: 21596

StreamCorruptedException, when using ObjectInputStream

I need to send an Object from client to server by serializing it.
This is my code:

     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;

Now, I am able to reach the Servlet, and I can retrieve the object through there.
The only problem is that as soon as I reach to this line:

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

I get an exception StreamCorruptedException, at the client side. (at the server side everything working great!) And if I take this line off, the servlet not being triggered (I mean the doGet() or doPost() not being called in the servlet)

What am I doing wrong?

This is the exact error:

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) 

Thanks,
Ray

Upvotes: 1

Views: 5898

Answers (2)

BalusC
BalusC

Reputation: 1108632

The client is expecting that the servlet writes an object back to the response something like:

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

But the servlet apparently actually doesn't write any object back. So the client should not decorate it with an ObjectInputStream. Just do so:

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

or simply

connection.connect();

if you're not interested in the response anyway. The connection is executed on demand only. The getInputStream() will do that implicitly. That's why the request is not been fired until you call getInputStream(). Also see this answer for more hints.

Upvotes: 4

Justin
Justin

Reputation: 4477

Don't do this stuff yourself, look at HttpClient and spring's HttpInvoker.

Upvotes: 0

Related Questions