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

Java 實作區域網路多人聊天室:基於 Socket 的 C/S 架構完整教學

     編輯:Java 相關知識

專案背景

課程設計需要實作網路通訊,選擇 Java Socket 開發 LAN 聊天室,避開複雜的佈線與路由設定。採用經典 Client/Server (C/S) 架構,Server 端管理連線與訊息廣播,Client 端負責 UI 與收發。

功能規格

Server 端Client 端
預設綁定本機 IP,可配置 Port手動輸入 Server IP 與 Port
可設最大連線數輸入暱稱登入
啟動/停止服務連線/斷開按鈕
顯示線上用戶列表 (含 IP)即時收發訊息、顯示歷史
群發訊息、用戶上下線通知自動重新整理用戶列表

核心類別設計

1. User.java - 用戶資料傳輸物件

public class User {
    private String name;
    private String ip;
    // 建構子、Getter/Setter、equals/hashCode 略
}

2. Server_more.java - 伺服器主類別 (Swing GUI)

關鍵元件:

  • ServerSocket 監聽連線
  • ArrayList<ClientThread> 管理所有客戶端執行緒
  • DefaultListModel 綁定 JList 顯示線上用戶
  • 內部類別 ServerThread:持續 accept() 新連線
  • 內部類別 ClientThread:處理單一客戶端收發

訊息協定 (以 @ 分隔):

登入:           "暱稱@IP"
伺服器廣播:     "伺服器:內容(多人發送)"
用戶訊息:       "發送者:內容(多人發送)"
上線通知:       "ADD@暱稱@IP"
下線通知:       "DELETE@暱稱"
滿人回應:       "MAX@錯誤訊息"
用戶列表同步:   "USERLIST@人數@暱稱1@IP1@暱稱2@IP2..."
關閉指令:       "CLOSE"

3. Client_more.java - 客戶端主類別 (Swing GUI)

關鍵元件:

  • Socket 連線 Server
  • MessageThread:背景執行緒持續 readLine() 接收訊息
  • HashMap<String, User> 快取線上用戶
  • 解析 Server 協定指令:ADD/DELETE/USERLIST/MAX/CLOSE

核心程式碼片段

Server 接受連線與廣播

// ServerThread.run()
while (true) {
    Socket socket = serverSocket.accept();
    if (clients.size() >= max) { // 滿人拒絕
        sendReject(socket);
        continue;
    }
    ClientThread ct = new ClientThread(socket);
    ct.start();
    clients.add(ct);
    broadcast("ADD@" + ct.getUser().getName() + "@" + ct.getUser().getIp());
    updateUserList();
}

// 廣播方法
void broadcast(String msg) {
    for (ClientThread ct : clients) {
        ct.getWriter().println(msg);
        ct.getWriter().flush();
    }
}

Client 訊息接收迴圈

// MessageThread.run()
while (true) {
    String msg = reader.readLine();
    StringTokenizer st = new StringTokenizer(msg, "/@");
    String cmd = st.nextToken();
    
    switch (cmd) {
        case "ADD":    // 新用戶上線
            onUserAdd(st.nextToken(), st.nextToken()); break;
        case "DELETE": // 用戶下線
            onUserRemove(st.nextToken()); break;
        case "USERLIST": // 初始列表
            loadUserList(st); break;
        case "MAX":    // 滿人
            showErrorAndClose(st.nextToken()); break;
        case "CLOSE":  // 伺服器關閉
            autoClose(); break;
        default:       // 一般聊天訊息
            appendMessage(msg);
    }
}

已知限制與優化方向

現狀缺口優化建議
無資料庫持久化引入 SQLite/MySQL 存用戶、聊天記錄
無私聊功能協定新增 TO@目標@內容,Server 路由轉發
單執行緒處理單客戶端改用 NIO (Selector) 或線程池提升擴展性
無心跳偵測斷線定期 PING/PONG 清理殭屍連線
Swing UI 單執行緒更新風險用 SwingUtilities.invokeLater() 確保執行緒安全
硬編碼 IP/Port外部化設定檔 (properties/YAML)

如何執行

  1. 編譯三個 Java 檔:javac *.java
  2. 2. 先啟動 Server:java Server_more 3. 再啟動多個 Client:java Client_more (輸入相同 Port、Server IP、不同暱稱) 4. 在 Client 介面發送訊息,觀察群發與用戶列表同步

完整原始碼結構


chat-room/
├── User.java           // 共用資料類別
├── Server_more.java    // 伺服器端 (含 GUI)
└── Client_more.java    // 客戶端 (含 GUI)

完整程式碼請參考文章原始內容 (已包含完整 import、GUI 佈局、事件處理、網路邏輯)。

總結

本專案示範了 Java Socket 開發 LAN 聊天室的完整流程:

  • 協定設計:自訂文字協定,簡單易除錯
  • 多執行緒:Server 端一連線一執行緒,Client 端收發分離
  • Swing GUI:即時顯示用戶列表與聊天紀錄
  • 優雅關閉:協定層面 CLOSE 指令協調資源釋放

雖功能基礎,但架構清晰,是進階 NIO、Netty、WebSocket、資料庫整合、私聊/群組/檔案傳輸等功能的絕佳起點。

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