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

Java 實作多功能聊天室:從 Socket 通訊到檔案傳輸完整教學

     編輯:Java 綜合教學

Java 實作多功能聊天室:從 Socket 通訊到檔案傳輸完整教學

本專案示範如何使用 Java Socket、多執行緒、序列化物件傳輸與 Swing GUI 建立一個功能完整的聊天室,包含註冊/登入、群發/私訊、上下線通知、抖動視窗、檔案傳輸等核心功能。

系統架構設計

  • 傳輸協定:TCP Socket,物件序列化 (ContextDemo implements Serializable) 封裝所有訊息類型。
  • 訊息類型 (type):0=上線、1=發送訊息、2=下線、3=抖動、4=發送檔案。
  • 伺服器端:單一 ServerSocket 監聽,每個客戶端連線啟動一條 Server_Thread 處理業務邏輯,HashMap<String, Socket> 管理在線用戶。
  • 客戶端:Swing GUI,含 Client_Thread 持續監聽伺服器推送訊息。

核心模組實作詳解

1. 通用傳輸物件 (ContextDemo)

public class ContextDemo implements Serializable {
    private int type;                    // 訊息類型
    private HashSet<String> clients;     // 目標用戶集合
    private String info;                 // 訊息內容
    private String name;                 // 發送者
    private String time;                 // 時間戳
    private String last;                 // 檔案副檔名
    private ArrayList<Byte> list2;       // 檔案位元組資料
    // Getter/Setter 省略
}

2. 伺服器端核心邏輯

啟動監聽與分派執行緒
public static ServerSocket ss;
public static HashMap<String, Socket> online = new HashMap<>();

static {
    try {
        ss = new ServerSocket(8080);
        System.out.println("伺服器已啟動,監聽 8080 埠...");
    } catch (IOException e) { e.printStackTrace(); }
}

public void action() {
    while (true) {
        Socket s = ss.accept();
        new Server_Thread(s).start(); // 每客戶端一條執行緒
    }
}
訊息廣播與指定發送
// 廣播給所有在線用戶
public void sendtoall(ContextDemo ctx) {
    for (Socket socket : online.values()) {
        try (ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())) {
            oos.writeObject(ctx);
            oos.flush();
        } catch (IOException e) { e.printStackTrace(); }
    }
}

// 發送給指定用戶 (關鍵:每次新建 ObjectOutputStream 避免流衝突)
public void sendtothis(ContextDemo ctx) {
    HashSet<String> targets = ctx.getClients();
    for (String name : online.keySet()) {
        if (targets.contains(name)) {
            Socket s = online.get(name);
            try (ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream())) {
                oos.writeObject(ctx);
                oos.flush();
            } catch (IOException e) { e.printStackTrace(); }
        }
    }
}
訊息處理總控
@Override
public void run() {
    try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {
        while (true) {
            ContextDemo ctx = (ContextDemo) ois.readObject();
            switch (ctx.getType()) {
                case 0: handleOnline(ctx); break;      // 上線
                case 1: handleMessage(ctx); break;     // 發送訊息
                case 2: handleOffline(ctx); return;    // 下線 (return 結束執行緒)
                case 3: handleShake(ctx); break;       // 抖動
                case 4: handleFile(ctx); break;        // 檔案傳輸
            }
        }
    } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); }
}

3. 客戶端 GUI 與互動流程

註冊/登入 (Properties 檔案儲存帳號)

使用 Users.properties 儲存帳密,登入成功後建立 Socket 連線並進入聊天室視窗 (ChatRoom)。

上線流程
  1. 客戶端建構子中封裝 type=0 物件發送給伺服器,啟動 Client_Thread 監聽。
  2. 伺服器收到後加入 online Map,組裝「上線通知」+「在線名單」廣播給所有客戶端。
  3. 客戶端收到 type=0 更新 JList 顯示在線用戶,並在訊息區顯示「XXX 上線啦!」
發送訊息 (群發/私訊)
  • 客戶端讀取 JList 選中項目 (未選則視為群發),封裝 type=1 發送。
  • 伺服器 sendtothis 轉發給目標用戶。
  • 接收端解析顯示「時間 發送者對我說: 內容」。
檔案傳輸實作細節
  1. 發送端:JFileChooser 選檔 → 讀入 ArrayList<Byte> → 封裝 type=4 含副檔名、位元組陣列發送。
  2. 伺服器:轉發給目標用戶。
  3. 接收端:ByteArrayInputStream + BufferedOutputStream 寫入磁碟 (sourse/dedao.副檔名)。
抖動視窗特效
public void shakeFrame() {
    int x = getX(), y = getY();
    for (int i = 0; i < 20; i++) {
        if ((i & 1) == 0) { x += 8; y += 8; }
        else { x -= 8; y -= 8; }
        setLocation(x, y);
        try { Thread.sleep(50); } catch (InterruptedException ignored) {}
    }
}

關鍵技術點總結

  • 多執行緒模型:伺服器每連線一執行緒,客戶端 GUI 與網路收發分離。
  • 序列化協定:單一 ContextDemo 承載所有業務類型,擴充容易。
  • 流管理陷阱:每次發送必須新建 ObjectOutputStream,否則多目標發送會導致流衝突 (作者耗時 10 小時除錯)。
  • 優雅下線:雙向確認 (伺服器回覆 type=2 批准),雙方關閉流與 Socket,客戶端 System.exit(0) 退出 JVM。

擴充建議

  • 引入資料庫替代 Properties 檔案儲存用戶資料。
  • 使用 NIO (Netty) 提升併發處理能力。
  • 加入訊息加密 (AES/SSL) 保障傳輸安全。
  • 支援圖片預覽、語音訊息、群組聊天等豐富功能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved