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

解决了版本三的不能连续发送消息 实现了全双工

思路:创建一个新的线程来实现数据的发送,main线程用于接受数据

客户端

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


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

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



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

        try {
    
    
            socket = new Socket("127.0.0.1", 8004);
            //根据套接字获取输出流  把信息从内存拿出来就是输出  写进内存就是输入

            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("客户端说:"+sc.next());



            }

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


    }
}

服务器

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

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


    static ServerSocket serverSocket;

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


        //创建服务端套接字ServerSocket  并指定端口号


        try {
    
    
            serverSocket = new ServerSocket(8004);





            //通过服务端套接字  监听客户端的连接  如果没有客户端连接  程序会停留在此处
            socket = serverSocket.accept();//返回的就是客户端的套接字   获取一个连接

            //创建一个新的线程来服务器给客户端发送数据
            new Thread(()->{
    
    
                try {
    
    

                    while (true) {
    
    
                        //服务端继续给客户端发送消息  这里使用socket  而不是serverSocket  是因为服务端只有一个  客户端有很多个  给指定客户端发信息
                        DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
                        dataOutputStream.writeUTF("服务端说:"+sc.next());
                        dataOutputStream.flush();
                    }

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

            while(true) {
    
    
                //根据客户端套接字  获取对应的输入流
                InputStream inputStream = socket.getInputStream();

                //将字节输入流包装成  数据字节流
                DataInputStream dataInputStream = new DataInputStream(inputStream);

                String s = dataInputStream.readUTF();
                System.out.println(s);



            }





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

    }
}

猜你喜欢

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