java - StreamCorruptedException,当使用 ObjectInputStream 时

标签 java http streaming io

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

     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 不会被触发(我的意思是 doGet()doPost() 不会在 servlet 中被调用)

我做错了什么?

这是确切的错误:

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) 

谢谢,

最佳答案

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

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

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

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

或者只是

connection.connect();

如果您对响应不感兴趣的话。连接仅按需执行。 getInputStream() 将隐式执行此操作。这就是为什么在调用 getInputStream() 之前不会触发请求的原因。另见 this answer获取更多提示。

关于java - StreamCorruptedException,当使用 ObjectInputStream 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2958385/

相关文章:

java - ArrayList不打印重复项(Java)

http - 尝试读取一个不存在的全局 'PROXY' Lua

php - 创建自定义状态代码

json - 解码 JSON,因为它仍在通过 net/http 流入

java - 使用 JSON 的 Volley Post - 获取 422 状态代码

java - 在单独的类中使用 ActionListener 使用原始类中 JTextfield 的数据

java - 使用Java在循环内并行执行方法

http - HTTP 服务器实现应该如何处理内部错误?

web-services - 用于传输对象数据的流式、异步、语言独立技术

javascript - 可以在不使用 RTSP 的情况下流式传输实时视频吗?