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("结束");
    }
}
相关推荐
菠萝崽.1 小时前
安装docker,在docker上安装mysql,docker上安装nginx
java·mysql·nginx·docker·软件工程·springboot·开发
极小狐1 小时前
极狐GitLab 议题权重有什么作用?
开发语言·数据库·chrome·c#·gitlab
狐凄2 小时前
Python实例题:使用Pvthon3编写系列实用脚本
java·网络·python
董先生_ad986ad4 小时前
C# 中的 `lock` 关键字本质
开发语言·c#
Lxinccode4 小时前
Java查询数据库表信息导出Word-获取数据库实现[1]:KingbaseES
java·数据库·word·获取数据库信息·获取kingbasees信息
元亓亓亓4 小时前
Java后端开发day36--源码解析:HashMap
java·开发语言·数据结构
sd21315124 小时前
RabbitMQ 复习总结
java·rabbitmq
道剑剑非道4 小时前
QT 打包安装程序【windeployqt.exe】报错c000007d原因:Conda巨坑
开发语言·qt·conda
小邓儿◑.◑5 小时前
C++武功秘籍 | 入门知识点
开发语言·c++
码银7 小时前
Java 集合:泛型、Set 集合及其实现类详解
java·开发语言