我正在使用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行上抛出。我也通过调试查看了原始数据,它们都匹配起来。在分割和发送之前,对象的字节匹配在接收之后重新组合的字节。我已经坚持了一段时间,如果有人可以提供帮助,这将非常有帮助。
答案 0 :(得分:1)
我遇到了将对象转换为字节数组,将该数组拆分为2部分,通过TCP流发送,接收数据,重构字节数组,然后重新构造对象的问题。
你当然是。这毫无意义。这里有太多的松软。你过度复杂并在这个过程中犯了错误。你不需要这些。这只是浪费时间和空间。 TCP已经分裂成段; IP已经分裂成数据包,路由器已经分裂成片段。你不需要添加另一层。
ByteArrayOutputStream
和ByteArrayInputStream
ObjectOutputStream
和一个ObjectInputStream,
,分别在两端包装套接字输出和输入流,并在套接字的生命周期内保留它们writeObject()
和readObject()