【发布时间】: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