Java 使用 ObjectStream 时的注意事项

在向下阅读以前,请注意 JavaBean 要实现 Serializable 接口。java

初始化时发生了什么?

ObjectOutputStream 初始化时会送出其 header 数据给对端。 ObjectInputStream 初始化时会阻塞地接收来自对端的 header 数据。缓存

发现了吗,这可能会有两处问题。socket

  1. 两端的输入和输出流的初始化的顺序不互恰,致使在 ObjectInputStream 的初始化阶段发生阻塞。
  2. 某端的输入或输出流和对端的输出或输入流初始化的次数不一样,致使阻塞或对端收到错误数据报异常。

对 (1) 咱们只要保证两端互恰便可。code

// server
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
// client
ois = new ObjectInputStream(socket.getInputStream());
oos = new ObjectOutputStream(socket.getOutputStream());

对 (2) 咱们要保证两端初始化的逻辑一致。server

通常用法示例

简单举例,也是给本身作个备忘。对象

数据包接口

import java.io.Serializable;

public class PersonBean implements Serializable {
    public String name = null;
}

get

ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
PersonBean person = (PersonBean) input.readObject();

input

PersonBean person = new PersonBean();
person.name = "name";

ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
output.writeObject(person);
output.flush(); // 若是不刷新,则 ObjectOutputStream 会缓存上一个对象的引用,致使每次都送出的是同一个。
相关文章
相关标签/搜索