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

Java C/S 架構聊天室實現:ServerSocket 多線程廣播與雙向 GUI 交互

     編輯:Java 相關知識

基於 ServerSocket + Swing/AWT 實現的局域網聊天室,包含服務端與客戶端完整代碼。特色:服務端為每個客戶端彈出獨立視窗,支援服務端主動向單客戶端發消息;客戶端支援快捷鍵發送、自動重連提示。

架構設計

  • 服務端:主線程 accept() 循環,每連接啟動一個 ClientConn 線程(繼承 Frame、實現 Runnable),維護 Collection<ClientConn> 廣播列表。
  • 客戶端:主視窗 ChatClient + 後台 ReceiveThread 輪詢 DataInputStream.readUTF()。
  • 通訊協議:DataOutputStream.writeUTF(String) / readUTF(),文本換行約定。

關鍵代碼片段

服務端廣播邏輯

public void run() {
    DataInputStream dis = new DataInputStream(s.getInputStream());
    String msg = dis.readUTF();
    while (msg != null && !msg.isEmpty()) {
        for (ClientConn cc : cClient) {
            if (cc != this) cc.send(msg, hostname); // 廣播給其他人
        }
        ta1.append(hostname + "說:\n" + msg + "\n"); // 本地視窗回顯
        msg = dis.readUTF();
    }
    dispose(); // 斷開清理
}

服務端主動發送

btn.addActionListener(e -> {
    DataOutputStream dos = new DataOutputStream(s.getOutputStream());
    dos.writeUTF("服務器:\n" + ta2.getText() + "\n");
    ta1.append("服務器:\n" + ta2.getText() + "\n");
    ta2.setText("");
});

改進建議(生產級)

  1. 替換 Vector/ArrayList 為 CopyOnWriteArrayList 或加鎖,解決並發修改異常。
  2. 引入心跳機制檢測死連接,避免 readUTF() 永久阻塞。
  3. 協議升級:JSON/Protobuf 承載類型、房間、私聊等擴展字段。
  4. UI 分離:採用 MVC,網絡層與 Swing 解耦,便於單測與換裝 JavaFX/Web 客戶端。
  5. 安全性:TLS 加密傳輸、用戶認證、輸入過濾防注入。

運行方式

  1. 編譯兩端代碼,修改客戶端 new Socket("10.20.10.201", 8888) IP。
  2. 先啟動 ChatServer,再啟動多個 ChatClient。
  3. 服務端主視窗顯示上下線日誌,每客戶端獨立視窗可雙向收發。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved