【问题标题】:Java - Invalid stream headerJava - 无效的流标头
【发布时间】:2015-07-25 15:31:10
【问题描述】:

我正在使用 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 行上抛出了错误。我还通过调试查看了原始数据,并且一切都匹配。对象在拆分和发送之前的字节数与接收后重新组合的字节数相匹配。我已经坚持了一段时间,如果有人可以提供帮助,那将非常有帮助。

【问题讨论】:

  • 你能在客户端使用相同的字节构造对象吗?
  • 我已经尝试过了,但我正在做的是首先创建一个新的 ByteArrayOutputSteam,然后创建一个新的 ObjectOutputStream,然后我写入对象并获取对象的字节。然后我冲洗并关闭这些流。然后我获取该数组并将其拆分为多个部分,然后通过附加到 Socket 输出流的 ObjectOutputStream 发送每个数组(套接字只有一个对象输出流。我不重新创建它)。然后我在服务器端接收它并将数组放在一起。
  • 然后我将那个数组发送到一个新的 ByteArrayInputStream,然后再发送到一个新的 ObjectInputStream。然后我用它来获取对象,但是在创建 ObjectInputStream 时会抛出该错误

标签: java serialization tcp network-programming objectoutputstream


【解决方案1】:

我在将对象转换为字节数组、将该数组拆分为 2 部分、通过 TCP 流发送每个部分、接收它、重建字节数组然后重新构造对象时遇到问题。

你当然是。没有用。这里的绒毛太多了。你把事情复杂化了,并且在这个过程中犯了错误。你不需要这些。这只是浪费时间和空间。 TCP 已经分割成段; IP 已经分裂成数据包,路由器已经分裂成片段。您不需要添加另一层。

  • 摆脱ByteArrayOutputStreamByteArrayInputStream
  • 依次创建一个ObjectOutputStream 和一个ObjectInputStream,,分别在两端包裹套接字输出和输入流,并在套接字的生命周期内保留它们
  • 直接在这些对象流上使用writeObject()readObject()
  • 不要在同一个套接字上使用任何其他流或读取器或写入器。

【讨论】:

  • 这不是我要找的。而且我认为你不明白我所说的分裂是什么意思。通过流发送字节时,您可以发送的数量受到限制,我认为大约是 64k。那么当你有 200k 字节时会发生什么?通过拆分它,我可以将它们发送过来并重新创建它们。这通常称为数据包流。无论如何,我发现我的问题是我没有从一开始就删除一些我插入并忘记删除的字节。所以我在技术上所做的一切工作都很好。
  • 当您尝试了这个但它不起作用时,请告诉我。我不会屏住呼吸。目前你只是猜测,你错了。显然,您还没有尝试过这里推荐的方法。通过流发送字节时,您不受任何限制,更不用说 64k。当你有 200k 字节时,只需发送它们。如上所述,所需的任何“数据包流”都已由 TCP 和 IP 完成。无需进一步的用户干预。你的问题和评论没有意义。
猜你喜欢
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多