課程設計需要實作網路通訊,選擇 Java Socket 開發 LAN 聊天室,避開複雜的佈線與路由設定。採用經典 Client/Server (C/S) 架構,Server 端管理連線與訊息廣播,Client 端負責 UI 與收發。
| Server 端 | Client 端 |
|---|---|
| 預設綁定本機 IP,可配置 Port | 手動輸入 Server IP 與 Port |
| 可設最大連線數 | 輸入暱稱登入 |
| 啟動/停止服務 | 連線/斷開按鈕 |
| 顯示線上用戶列表 (含 IP) | 即時收發訊息、顯示歷史 |
| 群發訊息、用戶上下線通知 | 自動重新整理用戶列表 |
public class User {
private String name;
private String ip;
// 建構子、Getter/Setter、equals/hashCode 略
}
關鍵元件:
ServerSocket 監聽連線ArrayList<ClientThread> 管理所有客戶端執行緒DefaultListModel 綁定 JList 顯示線上用戶ServerThread:持續 accept() 新連線ClientThread:處理單一客戶端收發訊息協定 (以 @ 分隔):
登入: "暱稱@IP"
伺服器廣播: "伺服器:內容(多人發送)"
用戶訊息: "發送者:內容(多人發送)"
上線通知: "ADD@暱稱@IP"
下線通知: "DELETE@暱稱"
滿人回應: "MAX@錯誤訊息"
用戶列表同步: "USERLIST@人數@暱稱1@IP1@暱稱2@IP2..."
關閉指令: "CLOSE"
關鍵元件:
Socket 連線 ServerMessageThread:背景執行緒持續 readLine() 接收訊息HashMap<String, User> 快取線上用戶ADD/DELETE/USERLIST/MAX/CLOSE// 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();
}
}
// 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) |
javac *.javajava 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 聊天室的完整流程:
CLOSE 指令協調資源釋放雖功能基礎,但架構清晰,是進階 NIO、Netty、WebSocket、資料庫整合、私聊/群組/檔案傳輸等功能的絕佳起點。