首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 物件序列化實現 Socket 傳輸完整範例

     編輯:Java 相關知識

利用 ObjectOutputStream/ObjectInputStream 可直接在 Socket 連線上傳遞 Java 物件。核心要求:傳輸的類必須實作 Serializable 標記介面。以下提供 Server/Client 完整雙向通訊範例。

1. 可序列化的資料類別

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 + "'}";
    }
}

2. Client 端:發送物件並接收修改後的回傳

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();
        }
    }
}

3. Server 端:接收、修改、回傳

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();
        }
    }
}

關鍵注意事項

  • serialVersionUID:跨 JVM 版本部署時必須固定,否則反序列化會拋 InvalidClassException。
  • 雙向流順序:Client 先建 ObjectOutputStream,Server 先建 ObjectInputStream,否則會死結(雙方都在等對方寫入 Stream Header)。
  • 安全性:反序列化任意物件有風險(如 Apache Commons Collections 鏈),生產環境建議使用 JSON/Protobuf 或啟用 JEP 290 過濾器。
  • 效能:Java 序列化體積較大、速度較慢,高吞吐場景請改用 Kryo、Hessian 或二進制協議。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved