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

标签 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 还是只是写/读?我是否必须摆脱序列化通信,是否必须创建另一个流用于读写?

最佳答案

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

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

解决这个问题的协议(protocol)可能是:

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

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

关于java - 从同一流发送序列化对象和 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17642646/

相关文章:

java - 如何在两个项目之间共享代码?

c++ - 套接字程序 Python vs C++ (Winsock)

json - Microsoft Azure dll 在 .NET 4.0 中引发异常

c# - 序列化不可序列化的自定义外部类

java - 如何最好地将递归函数转换为迭代函数?

java - 只有抽象方法和接口(interface)的抽象类——我应该使用哪个?

java - Hibernate:复合 id 与键多对一生成 java.lang.stackoverflow 错误

c - 阻塞套接字

java - 如何使用普通的虚拟主机包设置具有特定 IP 和端口的 Java 服务器?

c++ - 如何在 PBC 中存储序列化元素?