【问题标题】:StreamCorruptedException with heavy data over ObjectInputStreamStreamCorruptedException 与 ObjectInputStream 上的大量数据
【发布时间】:2012-08-09 18:30:18
【问题描述】:

我有一个基于 TCP 的服务器-客户端设置,其中客户端向服务器发送大量数据集。读/写使用 ObjectInput/OutputStream。在正常情况下我没有任何问题,但是当数据流变大时,我得到了 StreamCorruptedException: invalid type code。无效代码每次都不一样。我打开套接字一次并调用同步方法从多个线程发送数据。

客户:

socket = new Socket("localhost", sockNum);
out = new ObjectOutputStream(socket.getOutputStream());
in = new ObjectInputStream(socket.getInputStream());

public synchronized void sendMsg(Message msg){
    try{
        out.writeObject(security.signObject(msg, privKey));
        out.reset();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

服务器:

ServerSocket server = new ServerSocket(sockNum);
Socket client = server.accept();
ObjectInputStream in = new ObjectInputStream(client.getInputStream());

while(threadActive){
    Object line = in.readObject();
    handleObject(line);
}

更新:我在每次发送后添加了 out.reset() ,但这对问题没有帮助。我还在循环中添加了睡眠语句以降低数据速率。这消除了错误,但不是真正的解决方案。

编辑:所以自从我最初提出这个问题以来已经有一段时间了,但我又遇到了这个问题。我尝试设置我的系统,以便在每条发送消息后,线程等待“确认”消息作为回报。如果接收进程有 StreamCorruptedException,它会发回“重新发送”而不是 ack。这似乎导致的问题多于解决方案。还有其他想法吗?

【问题讨论】:

  • 该方法是您访问outsocket 的唯一地方吗,创建和关闭它们时除外?
  • @JoachimIsaksson:sendMsg 方法实际上包含在另一个跟踪所有 I/O 变量的对象中。此方法是从我的进程中的多个线程调用的。在这些线程中调用的唯一其他方法仅调用in.readObject(),它有一个超时。

标签: java corruption objectinputstream


【解决方案1】:

听起来您正在以多线程方式写入输出流,即您正在写入示例之外的其他地方。

顺便说一句:您是否定期重置()流以防止内存泄漏?

【讨论】:

  • 是的,我正在从多个线程调用 sendMsg()。这有问题吗?另外,我没有定期重置()流。我如何/何时这样做,以免丢失从另一个线程发送的信息?
  • 如果在序列化对象时更改对象,可能会损坏流。对象流会记住它曾经发送过的每个对象。使用 reset() 清除两端的缓存。
  • 这适用于嵌套对象吗?我正在发送一个 SignedObject ,其中包含一条 Message ,其中包含在某些时候会发生变化的数据。如果是这种情况,我增加的数据流可能会延迟传输足够长的时间以产生影响。
  • 例如,如果您有一个 ArrayList,并且在 ti 被序列化时更改它,它可能会损坏 a 流。
  • 我尝试在发送后添加一个 out.reset() (在代码中更新),但没有修复它。
猜你喜欢
  • 2020-05-13
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多