javapackage p1008; import java.io.*; import java.net.*; import java.util.*; public class ChatServer { private static final int PORT = 12345; private static Set<ClientHandler> clientHandlers = new HashSet<>(); public static void main(String[] args) { System.out.println("聊天服务器启动..."); try (ServerSocket serverSocket = new ServerSocket(PORT)) { while (true) { new ClientHandler(serverSocket.accept()).start(); } } catch (IOException e) { e.printStackTrace(); } } private static class ClientHandler extends Thread { private Socket socket; private PrintWriter out; private BufferedReader in; public ClientHandler(Socket socket) { this.socket = socket; } public void run() { try { in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); synchronized (clientHandlers) { clientHandlers.add(this); } // 发送欢迎消息 out.println("欢迎来到聊天室!"); System.out.println(socket.getLocalAddress()+" 来到了聊天室~!"); synchronized (clientHandlers) { for (ClientHandler client : clientHandlers) { if (client != this) { // 排除发送者 client.out.println(socket.getLocalAddress()+" 来到了聊天室~!"); } } } String message; while ((message = in.readLine()) != null) { System.out.println("收到消息: " + message); // 广播消息给所有在线用户,排除发送者 synchronized (clientHandlers) { for (ClientHandler client : clientHandlers) { if (client != this) { // 排除发送者 client.out.println(message); }else{ client.out.println("自己说:"+message); } } } if(message.equals("quit")){ System.out.println(socket.getLocalAddress()+" 退出服务器"); break; } } } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } synchronized (clientHandlers) { clientHandlers.remove(this); } } } } }
javapackage p1008; import java.io.*; import java.net.*; public class ChatClient { private static final String SERVER_ADDRESS = "localhost"; // 服务器地址 private static final int PORT = 12345; public static void main(String[] args) { try (Socket socket = new Socket(SERVER_ADDRESS, PORT); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) { // 接收服务器消息的线程 new Thread(() -> { String response; try { while ((response = in.readLine()) != null) { System.out.println(response); } } catch (IOException e) { System.out.println("结束与服务器通讯~!"); //e.printStackTrace(); } }).start(); // 发送消息到服务器 String userInput; while ((userInput = stdIn.readLine()) != null) { out.println(userInput); if(userInput.equals("quit")) break; } } catch (IOException e) { e.printStackTrace(); } System.out.println("结束"); } }
java 模拟多人聊天室,服务器与客户机
laocooon5238578862024-10-07 22:52
相关推荐
躺平的赶海人几秒前
C# Dictionary 线程安全指南:多线程下操作 Dictionary<string, DateTime> 的加锁策略lihongli0006 分钟前
ROS与Qt结合开发CAN控制界面(发布自定义的truck_send_can1消息)帧栈9 分钟前
开发避坑指南(64):修复IllegalArgumentException:参数值类型与期望类型不匹配坐不住的爱码11 分钟前
ArrayList和LinkedList的区别java1234_小锋15 分钟前
什么是Java三高架构?如竟没有火炬25 分钟前
全排列——交换的思想浓墨染彩霞30 分钟前
Java----set5pace30 分钟前
【JavaWeb|第一篇】Maven篇嵌入式小李.man38 分钟前
C++第十三篇:继承Bryce李小白44 分钟前
Kotlin Flow 的使用