java 模拟多人聊天室,服务器与客户机

java 复制代码
package 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);
                }
            }
        }
    }
}
java 复制代码
package 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("结束");
    }
}
相关推荐
春蕾夏荷_7282977251 小时前
qt ElaWidgetTools第一个实例
开发语言·qt
lizz312 小时前
从 JUnit 深入理解 Java 注解与反射机制
java·开发语言·junit
编啊编程啊程5 小时前
JUC之AQS
java·开发语言·jvm·c++·kafka
孟婆来包棒棒糖~6 小时前
Maven快速入门
java·spring boot·spring·maven·intellij-idea
jingfeng5148 小时前
C++模板进阶
java·c++·算法
杨杨杨大侠9 小时前
附录 1:[特殊字符] Maven Central 发布完整指南:从零到成功部署
java·spring boot·maven
好学且牛逼的马9 小时前
GOLANG 接口
开发语言·golang
ahauedu9 小时前
AI资深 Java 研发专家系统解析Java 中常见的 Queue实现类
java·开发语言·中间件
韭菜钟9 小时前
在Qt中用cmake实现类似pri文件的功能
开发语言·qt·系统架构