基於 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("");
});
Vector/ArrayList 為 CopyOnWriteArrayList 或加鎖,解決並發修改異常。readUTF() 永久阻塞。new Socket("10.20.10.201", 8888) IP。ChatServer,再啟動多個 ChatClient。