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 會緩存上一個對象的引用,致使每次都送出的是同一個。
相關文章
相關標籤/搜索