0

我的工作一些网络与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

我已经尝试过,但是我所做的是首先创建一个新的ByteArrayOutputSteam,然后创建一个新的ObjectOutputStream,然后编写该对象并获取该对象的字节。然后我冲洗并关闭这些流。然后我把这个数组分成几部分,然后通过连接到Socket输出流的ObjectOutputStream发送每个数组(对于套接字只有一个对象输出流,我不重新创建它)。然后我在服务器端接收它并将这些阵列放在一起。 – Jmrapp

+0

然后我把那个单个数组发送给一个新的ByteArrayInputStream,然后把它发送给一个新的ObjectInputStream。然后我使用它来获取对象,但它创建ObjectInputStream时会引发该错误 – Jmrapp

回答

1

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

当然你。没有用。这里有太多的毛病。你过度复杂化并在过程中犯错误。你不需要这些。这只是浪费时间和空间。 TCP已经分裂成细分市场; IP已经分裂成分组,并且路由器已经分裂成分段。您不需要添加其他图层。

  • 摆脱ByteArrayOutputStreamByteArrayInputStream
  • 的创建一个ObjectOutputStream和按顺序一个ObjectInputStream,,围绕插座输出包裹并分别输入流,在两端,并让他们套接字
  • 的生活
  • 直接在这些对象流上使用writeObject()readObject()
  • 不在同一个套接字上使用任何其他流或读取器或编写器。
+0

这不是我要找的东西。我不认为你明白我的意思是分裂。当通过流发送字节时,您仅限于发送的数量,我认为它大约是64k。那么当你有200k字节时会发生什么?通过分割它,我可以将它们发送并重新创建它们。这通常称为数据包流式传输。无论如何,我发现我的问题是我没有删除从插入的一些字节,我插入并忘记删除。所以我在技术上的一切工作都很好。 – Jmrapp

+0

当你试过这个,它不起作用,让我知道。我不会屏住呼吸。目前你只是在猜测,而你错了。显然你没有尝试过这里推荐的东西。通过流发送字节时,不受任何限制,更不用说64k了。当你有200k字节时,只需发送它们。如上所述,任何'数据包流传输'都需要TCP和IP来完成。不需要进一步的用户干预。你的问题和评论没有意义。 – EJP