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

Java 聊天程式 Bug:客戶端訊息重複顯示、服務端廣播邏輯錯誤

     編輯:程式設計綜合問答

現象

開啟 3 個客戶端 A、B、C,A 發送訊息,B 顯示 3 次相同訊息,C 無反應。

客戶端問題

// 客戶端讀取執行緒
while (flag) {
    message = dis.readUTF(); // 讀取伺服器廣播
    ta.setText(ta.getText() + message + '\n'); // 每次追加
}

若伺服器廣播 N 次,客戶端就顯示 N 次。

服務端核心 Bug

class ChatClient implements Runnable {
    // 問題:dis、dos 為**靜態成員變數**,所有客戶端共用同一組流!
    private DataInputStream dis;
    private DataOutputStream dos;
    
    public void run() {
        while (flag) {
            message = dis.readUTF(); // 實際讀取的是最後一個連線的輸入流
            for (ChatClient c : clients) {
                c.send(message); // 廣播給所有客戶端
            }
        }
    }
}

修正方案

  1. 服務端:每個 ChatClient 實例擁有獨立的 dis/dos
    class ChatClient implements Runnable {
        private Socket socket;
        private DataInputStream dis;
        private DataOutputStream dos;
        
        public ChatClient(Socket s) {
            this.socket = s;
            try {
                dis = new DataInputStream(socket.getInputStream());
                dos = new DataOutputStream(socket.getOutputStream());
            } catch (IOException e) { ... }
        }
        // run() 和 send() 使用 this.dis / this.dos
    }
  2. 客戶端:避免重複追加相同訊息(可加入訊息 ID 去重)
  3. 關閉資源:在 finally 正確關閉 socket、流

架構建議

  • 使用成熟網路框架(Netty、Mina)而非手寫 Socket
  • 定義協議(JSON/Protobuf)替代 DataInputStream.readUTF()
  • 引入執行緒池管理客戶端連線
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved