客户端与服务器通信(版本5)

在之前的基础上实现了群聊 可以设置多个客户端

客户端

//服务端可以不断的发送信息给客户端  也可以不断的接受客户端的信息
//多个客户端   一个服务器
public class Client051 {
    
    


    static Scanner sc = new Scanner(System.in);

    static  Socket socket;
    public static void main(String[] args) {
    
    



        //创建客户端套接字   用户交互服务器

        try {
    
    
            socket = new Socket("127.0.0.1", 8005);
            System.out.println("客户端1开启");
            //根据套接字获取输出流  把信息从内存拿出来就是输出  写进内存就是输入

            new Thread(()->{
    
    
                    while (true) {
    
    
                        try {
    
    
                            DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
                            String s = null;
                            s = dataInputStream.readUTF();
                            System.out.println(s);
                        } catch (IOException e) {
    
    
                            e.printStackTrace();
                        }
                    }
                    //获取服务端发过来的消息


            }).start();

            while (true) {
    
    
                OutputStream outputStream = socket.getOutputStream();

                //将字节输出流包装成数据字节输出
                DataOutputStream dataOutputStream = new DataOutputStream(outputStream);

                dataOutputStream.flush();
                //这行代码的确定缺点 程序会阻塞在这里等待输入
                dataOutputStream.writeUTF("客户端1说:"+sc.next());



            }

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


    }
}

服务器

//服务端可以不断的发送信息给客户端  也可以不断的接受客户端的信息
//多个客户端   一个服务器
public class Server05 {
    
    
    //定义集合用来存放每一个客户端socket
    private static List<Socket> socketList = new ArrayList<>();

    static Scanner sc = new Scanner(System.in);


    static ServerSocket serverSocket;

    static Socket socket;
    public static void main(String[] args) {
    
    




        try {
    
    

            //创建服务端套接字ServerSocket  并指定端口号
            serverSocket = new ServerSocket(8005);
            System.out.println("-------------------服务器开启-------------------");
            //主线程用来不停的监听客户端  把客户端放进集合保存起来
                while (true) {
    
    
                    try {
    
    
                        socket = serverSocket.accept();//因为我们要监听多个客户端  所以要将它放在循环里面  当客户端端建立连接后继续往下运行
                        socketList.add(socket);//有人连接到服务器  就将它的socket保存到list集合里面去
                        System.out.println("当前在线人数为:"+socketList.size());//用来记录与服务器连接的客户端数量


                        //创建一个新的线程不停的获取数据然后发送给每一个客户端
                        new Thread(()->{
    
    
                            boolean flag = false;
                            Socket mySelf = null;
                            while (true) {
    
    
                                try {
    
    

                                    if(!flag) {
    
    
                                        mySelf = socket;//保证当前线程只拿到一个socket
                                        flag = true;
                                    }

                                    DataInputStream dataInputStream = new DataInputStream(mySelf.getInputStream());
                                    String s = dataInputStream.readUTF();
                                    for (Socket socketTemp : socketList) {
    
    
                                        if(mySelf == socketTemp) {
    
    
                                            continue;
                                        }

                                        DataOutputStream dataOutputStream = new DataOutputStream(socketTemp.getOutputStream());
                                        dataOutputStream.writeUTF(s);
                                        dataOutputStream.flush();
                                    }
                                } catch (IOException e) {
    
    
                                    e.printStackTrace();
                                }
                            }

                        }).start();


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


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

    }
}

猜你喜欢

转载自blog.csdn.net/qq_45100361/article/details/113549783