Java - 无效的流标头

时间:2015-05-14 05:50:07

标签: java serialization tcp network-programming objectoutputstream

我正在使用Java进行一些网络连接,我遇到了将对象转换为字节数组,将该数组分成2部分,通过TCP流发送每个部分,接收它,重建字节数组,然后出现问题的问题。改革对象。

到目前为止一切正常。除了对象的重建之外,我拥有它。使用ObjectInputStream时出现此错误:

java.io.StreamCorruptedException: invalid stream header: 34323435

我在网上看到的是一个常见错误。我试过修理它。我听说过的原因之一是在发送字节后没有刷新流,但我的代码确实在发送之前刷新了它。我发送数据的代码是:

 public void sendTcp(ObjectOutputStream tcpOut) {
    try {
        synchronized(tcpOut) {
            tcpOut.write(data);
            tcpOut.flush();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我能够在服务器端成功读取这些字节。将字节组合在一起时会出现问题。完成后,我使用它来重新创建对象:

ByteArrayInputStream in = new ByteArrayInputStream(data);
ObjectInputStream is = new ObjectInputStream(in);
Object object = is.readObject();
is.close();
in.close();

但是错误会在ObjectInputStream行上抛出。我也通过调试查看了原始数据,它们都匹配起来。在分割和发送之前,对象的字节匹配在接收之后重新组合的字节。我已经坚持了一段时间,如果有人可以提供帮助,这将非常有帮助。

1 个答案:

答案 0 :(得分:1)

  

我遇到了将对象转换为字节数组,将该数组拆分为2部分,通过TCP流发送,接收数据,重构字节数组,然后重新构造对象的问题。

你当然是。这毫无意义。这里有太多的松软。你过度复杂并在这个过程中犯了错误。你不需要这些。这只是浪费时间和空间。 TCP已经分裂成段; IP已经分裂成数据包,路由器已经分裂成片段。你不需要添加另一层。

  • 摆脱ByteArrayOutputStreamByteArrayInputStream
  • 按顺序创建一个ObjectOutputStream和一个ObjectInputStream,,分别在两端包装套接字输出和输入流,并在套接字的生命周期内保留它们
  • 直接在这些对象流上使用writeObject()readObject()
  • 请勿在同一套接字上使用任何其他流或读者或作者。