利用 ObjectOutputStream/ObjectInputStream 可直接在 Socket 連線上傳遞 Java 物件。核心要求:傳輸的類必須實作 Serializable 標記介面。以下提供 Server/Client 完整雙向通訊範例。
import java.io.Serializable;
public class Employee implements Serializable {
private static final long serialVersionUID = 1L; // 建議顯式宣告
private int employeeNumber;
private String employeeName;
public Employee(int num, String name) {
this.employeeNumber = num;
this.employeeName = name;
}
// getter/setter 略
@Override public String toString() {
return "Employee{no=" + employeeNumber + ", name='" + employeeName + "'}";
}
}
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
try (Socket socket = new Socket("127.0.0.1", 11111);
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) {
Employee emp = new Employee(150, "Joe");
System.out.println("發送: " + emp);
out.writeObject(emp);
out.flush();
Employee updated = (Employee) in.readObject();
System.out.println("接收: " + updated);
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
try (ServerSocket server = new ServerSocket(11111)) {
System.out.println("Server 啟動,等待連線...");
try (Socket socket = server.accept();
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream())) {
Employee emp = (Employee) in.readObject();
System.out.println("收到: " + emp);
emp.setEmployeeNumber(256);
emp.setEmployeeName("John");
out.writeObject(emp);
out.flush();
System.out.println("已回傳修改後物件");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
InvalidClassException。ObjectOutputStream,Server 先建 ObjectInputStream,否則會死結(雙方都在等對方寫入 Stream Header)。