Java SE(10)

java 聊天室

服务端
public class ChatRoomServer {
    /**
     * 创建一个ArrayList对象 来保存聊天室成员
     */
    static List<Socket> socketList = new ArrayList<>();

    public static void main(String[] args) throws IOException, InterruptedException {
        ServerSocket serverSocket = new ServerSocket(9999);
        /**
         * 单独的一个线程  用来实现消息的群发
         */
        new Thread(new SendMsgThread(socketList)).start();
        System.out.println("等待客户端启动中......");
        while (true) {
            /**
             * 等待客户端的连接  如果没有连接 线程会一直等待客户端的连接
             */
            Socket socket = serverSocket.accept();
            /**
             *   将连接的客户端( socket )存入集合( socketList )
             */
            socketList.add(socket);
          //  System.out.println(socket.getInetAddress() + "上线了....");
            /**
             *   为每一个上线的新成员 单独的开设一个 线程
             */
            new Thread(new ReadMsgThread(socket)).start();
        }

    }

    static class ReadMsgThread implements Runnable {
        private Socket socket;

        public ReadMsgThread(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                boolean flag=true;
                while (true) {
                    /**
                     *   获取输入流  读取消息
                     *   接收成员发送的消息
                     */
                    InputStream in = socket.getInputStream();
                    byte[] bytes = new byte[1024];
                    int read = in.read(bytes);
                    //  xxx&你好
                    String mag=new String(bytes,0,read);
                    // 解析  正则表达式 按照 & 分割
                    String[] spilt=mag.split("&");
                    /**
                     * 昵称 spilt 数组的第一个 为昵称
                     */
                    String nickName= spilt[0];
                    /**
                     * 要发送的内容  spilt 数组的第一个 为要发送的内容
                     */
                    String content=spilt[1];
                    if(flag){
                        System.out.println(nickName+"上线了.............");
                        flag=false;
                    }
                    System.out.println(nickName+"说:"+content);
                }
            } catch (Exception e) {
            }
        }
    }

    /**
     * 消息群发的线程
     */
    static class SendMsgThread implements Runnable {
        private List<Socket> socketList;

        public SendMsgThread(List<Socket> socketList) {
            this.socketList = socketList;
        }

        @Override
        public void run() {
            try {
                /**
                 * 输出流  服务端用来向客户端发送消息
                 */
                Scanner scan=new Scanner(System.in);
                while (true){
                    System.out.println("请输入你要发的内容:");
                    String msg= scan.next();
                    /**
                     * 遍历 socketList 获取集合中的每一个socket
                     */
                    for (Socket socket:socketList) {
                        OutputStream out = socket.getOutputStream();
                        out.write(msg.getBytes());
                    }
                }


            } catch (Exception e) {
            }

        }
    }
}
客户端1
public class ChatClient01 {
    private static final long serialVersionUID = -4639126076052875403L;
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 9999);
        /**
         * 启动接收   服务端 向客户端群发的信息
         */
        new Thread(new ReadServerMsg(socket)).start();
        Scanner scan=new Scanner(System.in);
        System.out.println("请设置你的昵称: ");
        String nickName=scan.next();
        while (true){
            OutputStream out=socket.getOutputStream();
            System.out.println("请输入你要发送的内容:");
            String content=scan.next();
            /**
             * 打包所有的信息  昵称 发送的消息  使用'&'连接
             * eg: 张三&你好
             */
            String msg=nickName+"&"+content;
            out.write(msg.getBytes());
        }
    }
    static class ReadServerMsg implements Runnable{
        private Socket socket;

        public ReadServerMsg(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                while (true){
                    InputStream in=socket.getInputStream();
                    byte[] bytes=new byte[1024];
                    int read=in.read(bytes);
                    String msg=new String(bytes,0,read);
                    System.out.println("Server:"+msg);
                }
            }catch (Exception e){

            }
        }
    }
}
客户端2
public class ChatClient02 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 9999);
        /**
         * 启动接收  服务端  群发消息的线程
         */
        new Thread(new ReadServerMsg(socket)).start();
        Scanner scan=new Scanner(System.in);
        System.out.println("请设置你的昵称:");
        String nickName= scan.next();
        while (true){
            OutputStream out=socket.getOutputStream();
            System.out.println("请输入你要发送的内容:");
            String content=scan.next();
            /**
             * 打包所有的信息  昵称 发送的消息  使用'&'连接
             * eg: 张三&你好
             */
            String msg=nickName+content;
            out.write(msg.getBytes());
        }
    }
   static class ReadServerMsg implements Runnable{
        private Socket socket;

        public ReadServerMsg(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                while (true){
                    InputStream in=socket.getInputStream();
                    byte[] bytes=new byte[1024];
                    int read=in.read(bytes);
                    String msg=new String(bytes,0,read);
                    System.out.println("Server:"+msg);
                }
            }catch (Exception e){

            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值