K20230113-JAVA-聊天室/服务器/客户端/线程

Server群聊服务器

/**
 * 聊天室 服务端
 */
public class ChatRoomServer {
    // 聊天室中的成员
    static List<Socket> socketList = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        new Thread(new CSThread.ServerMsgAllSend(socketList)).start(); // server线程 用来群发消息
        while (true) {
            Socket socket = serverSocket.accept(); // 等待客户端连接
            socketList.add(socket); // 将新连接的socket存入集合
            // 为每一个socket启动专有线程 为之服务 读取消息
            new Thread(new CSThread.ServerReadMsgThread(socket)).start();
        }
    }
}

客户端

// 客户端 
public class ChatClient {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("localhost", 9999);
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的用户名");
        String nickName = sc.next();
        new Thread(new CSThread.ClientReadServerMsg(socket)).start();// 接收server调整
        while (true){
            ServerTool.send(nickName,socket);
        }
    }
}

ServerTool 工具类[判断客户端退出,删除客户端,Server群发消息,Send]

public class ServerTool {
    static List<Socket> socketList = new ArrayList<>(); // 客户端集合
    // 判断客户端下线
    public static boolean clientIsClose(Socket socket){
        try {
            // 发送一条信息 如果客户端关闭将会报错
            socket.sendUrgentData(0);
            return false;
        }catch (Exception e){
            // 如果报错表示客户端已退出
            deleteSocket(socket);
            return true;
        }
    }
    //删除客户端
    public static void deleteSocket(Socket socket){
        socketList.remove(socket);
    }
    // 群发消息
    public static void sendAll(List<Socket> socketList,String msg){
        for(Socket socket:socketList){
            if (clientIsClose(socket))
                continue;
            try {
                OutputStream ops =  socket.getOutputStream();
                ops.write((msg).getBytes());
                ops.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    // send
    public static void send(String nickName ,Socket socket) throws Exception {
        OutputStream out = socket.getOutputStream();
        Scanner s = new Scanner(System.in);
        System.out.println("请输入您要发送的内容:");
        String content = s.next();

        String msg = nickName +"&"+ content;
        out.write(msg.getBytes());
    }
    // todo 服务器单独发消息
}

Server&Client线程类[Server获取信息,Server群发消息,Client]

public class CSThread {
    // Server获取消息
    static class ServerReadMsgThread implements Runnable {
        private Socket socket;

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

        @Override
        public void run() {
            boolean flag = true;
            String clientName = "";
            String clientmsg = "";
            try {
                while (true) {
                    // 接收成员发送的消息
                    //获取输入流  读取消息
                    InputStream in = socket.getInputStream();
                    byte[] bytes = new byte[1024];
                    int read = in.read(bytes);
                    String msg = new String(bytes, 0, read);
                    String[] split = msg.split("&"); // 分隔
                    clientName = split[0];
                    clientmsg = split[1];
                    if (flag) {
                        System.out.println(clientName + "上线了...");
                        flag = false;
                    }
                    System.out.println(clientName
                            + "说:" + clientmsg);
                }
            } catch (Exception e) {
                if (ServerTool.clientIsClose(socket) && clientName != "") {
                    System.out.println(clientName + "下线了...");
                }
//                e.printStackTrace();
            }
        }
    }

    // Server群发消息
    static class ServerMsgAllSend implements Runnable {
        private List<Socket> socketList;

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

        @Override
        public void run() {
            try {
                Scanner sc = new Scanner(System.in);
                while (true) {
                    System.out.println("请输入群发的消息:");
                    String msg = sc.nextLine();
                    ServerTool.sendAll(socketList, msg);//调用工具类的sendAll方法

                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // Client接收Server群发消息
    static class ClientReadServerMsg implements Runnable {

        private Socket socket;

        public ClientReadServerMsg(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 serverMsg = new String(bytes, 0, read);
                    System.out.println("server:" + serverMsg);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值