聊天室服務器端
package tf.thread; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ChatServer { private static final int PORT = 8888; // 端口號 private static List<Socket> list = new ArrayList<Socket>(); // 保存鏈接對象 private ExecutorService exec; private ServerSocket server; public static void main(String[] args) { new ChatServer(); } public ChatServer() { try { server = new ServerSocket(PORT); exec = Executors.newCachedThreadPool(); System.out.println("服務器已啓動!"); Socket client = null; while (true) { client = server.accept(); // 接收客戶鏈接 list.add(client); exec.execute(new ChatTask(client)); } } catch (IOException e) { e.printStackTrace(); } } static class ChatTask implements Runnable { private Socket socket; private BufferedReader br; private PrintWriter pw; private String msg; public ChatTask(Socket socket) throws IOException { this.socket = socket; br = new BufferedReader(new InputStreamReader(socket .getInputStream())); msg = "【" + this.socket.getInetAddress() + "】進入聊天室!當前聊天室有【" + list.size() + "】人"; sendMessage(); } public void run() { try { while ((msg = br.readLine()) != null) { if (msg.trim().equals("bye")) { list.remove(socket); br.close(); pw.close(); msg = "【" + socket.getInetAddress() + "】離開聊天室!當前聊天室有【" + list.size() + "】人"; socket.close(); sendMessage(); break; } else { msg = "【" + socket.getInetAddress() + "】說:" + msg; sendMessage(); } } } catch (IOException e) { e.printStackTrace(); } } /** * 羣發消息給聊天室的全部人 */ private void sendMessage() throws IOException { System.out.println(msg); for (Socket client : list) { pw = new PrintWriter(client.getOutputStream(), true); pw.println(msg); } } } }
聊天室客戶端(輸入bye可退出聊天室)
package tf.thread; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ChatClient { private static final int PORT = 8888; private static ExecutorService exec = Executors.newCachedThreadPool(); public static void main(String[] args) throws Exception { new ChatClient(); } public ChatClient() { try { Socket socket = new Socket("192.168.1.120", PORT); exec.execute(new Sender(socket)); System.out .println("【" + socket.getInetAddress() + "】您好,歡迎來到阿飛聊天室!"); BufferedReader br = new BufferedReader(new InputStreamReader(socket .getInputStream())); String msg; while ((msg = br.readLine()) != null) { System.out.println(msg); } } catch (Exception e) { } } /** * 客戶端線程獲取控制檯輸入消息 */ static class Sender implements Runnable { private Socket socket; public Sender(Socket socket) { this.socket = socket; } public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); String msg; while (true) { msg = br.readLine(); pw.println(msg); if (msg.trim().equals("bye")) { pw.close(); br.close(); exec.shutdownNow(); break; } } } catch (Exception e) { e.printStackTrace(); } } } }