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("结束");
    }
}
相关推荐
光锥智能7 分钟前
海康机器人举行2026移动机器人新品发布会:箱式存拣升级,「明智」系列发布
java·前端·机器人
行思理19 分钟前
Nginx 跨站请求(CORS)配置完全指南:从原理到生产实践
java·前端·nginx
小溪学编程27 分钟前
Spring @Bean 与 @Component 注解的区别详解
java·后端·spring
Wang's Blog1 小时前
Java 项目实战: 交友项目 - 圈子互动章总结与自检清单
java·bootstrap·交友
云和数据.ChenGuang1 小时前
Python 常见特殊方法详解:__new__、__init__、__del__、__str__、__repr__ 与 __getattribute__
开发语言·人工智能·python·1024程序员节
xyouyuweizhu1 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
代码方舟2 小时前
零信任架构实战:基于天远人企关联构建自动化供应链核心企业关联穿透与利益冲突审查网关
java·人工智能·架构·自动化
多弗朗皮卡丘2 小时前
C++的IO流
开发语言·c++·io流·文件io流
liyi_hz20082 小时前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
骑着蜗牛撵大象3272 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph