StreamCorruptedException,当使用ObjectInputStream时

时间:2010-06-02 13:57:58

标签: java http streaming io

我需要通过序列化将一个Object从客户端发送到服务器 这是我的代码:

     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;

现在,我能够到达Servlet,我可以通过那里检索对象 唯一的问题是,一旦我到达这一行:

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

我在客户端遇到异常StreamCorruptedException。 (在服务器端,一切都很棒!) 如果我关闭这一行,则不会触发servlet(我的意思是在servlet中没有调用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) 

谢谢,
射线

2 个答案:

答案 0 :(得分:4)

客户端期望servlet将对象写回响应,如:

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

但是servlet显然实际上没有写回任何对象。所以客户端不应该使用ObjectInputStream来装饰它。就这样做:

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

或只是

connection.connect();

如果你对这个回复不感兴趣的话。连接仅按需执行。 getInputStream()将隐式执行此操作。这就是为什么在您致电getInputStream()之前未触发请求的原因。另请参阅this answer以获取更多提示。

答案 1 :(得分:0)

不要自己做这些东西,看看HttpClient和Spring的HttpInvoker。