从同一个流发送序列化对象和byte []

时间:2013-07-14 19:02:08

标签: java sockets serialization

我有一个客户端服务器应用程序,它们通过objectoutputstream和objectinputstream进行通信。我将序列化对象从一个发送到另一个,但现在我也想发送文件。如果我在序列化对象中传递文件的byte [],它可以被传输,但是对象保持在objectoutputstream和objectinputstream,并且在一些发送之后,如果文件足够大,我会得到内存异常。如果我发送它像:

File file = new File("C:\\a.txt");
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] buffer = new byte[1024*1024*10];
int n = -1;
while((n = bis.read(buffer))!=-1) {
    oos.write(buffer,0,n);
}

并阅读:

while ((fromServer = ois.read()) != null) {

}

效果很好。

我的问题是,我是否必须实现一个系统来知道我是否需要writeObject / readObject或者只是写/读?我是否必须摆脱序列化通信,是否必须创建另一个用于读写的流?

1 个答案:

答案 0 :(得分:2)

您必须定义一个没有任何歧义的协议,并在客户端和服务器上坚持使用此协议。

例如,如果发送一个字节流,然后发送一个对象,则在接收端无法知道字节流何时结束以及何时开始对象。

解决此问题的协议可能是:

  • 发送一个int(4个字节),它是文件的大小N
  • 发送N个字节
  • 发送对象

接收方可以读取大小(N),然后从流中读取N个字节,然后读取对象。

相关问题