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

Java Socket 發送對象完整實戰指南

     編輯:Java 相關知識

前言

在網絡編程中,直接傳輸 Java 對象比拼接字符串更結構化、類型安全。本文通過一個完整的客戶端-服務端示例,演示如何使用 ObjectOutputStream 和 ObjectInputStream 實現對象的網絡傳輸。

核心要求

  1. 實體類必須實現 Serializable 接口
  2. 建議顯式聲明 serialVersionUID 確保版本兼容
  3. 發送端寫入對象後必須調用 flush()
  4. 關鍵點:客戶端與服務端的實體類包名、類名、字段定義必須完全一致

實體類定義

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

常見坑點總結

  • ClassNotFoundException:雙方 classpath 中找不到對應類,檢查包名是否一致
  • InvalidClassException:serialVersionUID 不匹配,建議顯式指定
  • 傳輸阻塞:忘記調用 flush() 導致數據滯留緩衝區
  • 安全性提示:反序列化存在安全風險,生產環境建議使用 JSON、Protobuf 等安全協議

擴展建議

實際項目中,可考慮使用 Netty 等高性能網絡框架,配合 Kryo、Hessian 或 Protobuf 進行高效序列化,並添加心跳檢測、重連機制、線程池管理等企業級特性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved