1

我有一个客户端服务器应用程序,它们通过 objectoutputstream 和 objectinputstream 进行通信。我将序列化对象从一个发送到另一个,但现在我也想发送文件。如果我在序列化对象中传递文件的字节 [],它可以被传输,但对象停留在 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) {

}

效果很好。

我的问题是,我是否必须实现一个系统才能知道我是必须写对象/读对象还是只写/读?我是否必须摆脱序列化通信,我是否必须创建另一个用于读写的流?

4

1 回答 1

2

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

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

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

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

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

于 2013-07-14T21:37:06.327 回答