開啟 3 個客戶端 A、B、C,A 發送訊息,B 顯示 3 次相同訊息,C 無反應。
// 客戶端讀取執行緒
while (flag) {
message = dis.readUTF(); // 讀取伺服器廣播
ta.setText(ta.getText() + message + '\n'); // 每次追加
}
若伺服器廣播 N 次,客戶端就顯示 N 次。
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); // 廣播給所有客戶端
}
}
}
}
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
}
finally 正確關閉 socket、流DataInputStream.readUTF()