在網絡編程中,直接傳輸 Java 對象比拼接字符串更結構化、類型安全。本文通過一個完整的客戶端-服務端示例,演示如何使用 ObjectOutputStream 和 ObjectInputStream 實現對象的網絡傳輸。
Serializable 接口serialVersionUID 確保版本兼容flush()package com.qiantu.bean;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String password;
// Getter/Setter 省略
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
package test;
import java.io.*;
import java.net.*;
import com.qiantu.bean.User;
public class TestServer {
public void start() {
try (ServerSocket ss = new ServerSocket(7777);
Socket socket = ss.accept();
ObjectInputStream ois = new ObjectInputStream(
new BufferedInputStream(socket.getInputStream()))) {
System.out.println("等待客戶端連接...");
Object obj = ois.readObject();
if (obj instanceof User) {
User user = (User) obj;
System.out.println("接收用戶: " + user.getName());
System.out.println("密碼: " + user.getPassword());
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new TestServer().start();
}
}
package client;
import java.io.*;
import java.net.*;
import com.qiantu.bean.User;
public class TestClient {
public void start() {
try (Socket socket = new Socket("127.0.0.1", 7777);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())) {
User user = new User();
user.setName("梁國俏");
user.setPassword("123456");
oos.writeObject(user);
oos.flush(); // 必須刷新緩衝區
System.out.println("對象發送完成");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new TestClient().start();
}
}
serialVersionUID 不匹配,建議顯式指定flush() 導致數據滯留緩衝區實際項目中,可考慮使用 Netty 等高性能網絡框架,配合 Kryo、Hessian 或 Protobuf 進行高效序列化,並添加心跳檢測、重連機制、線程池管理等企業級特性。