BIO的阻塞

java的网络编程大概可以分为BIO,NIO,AIO三种

第一种BIO是传统的io流为基础的,他是一种阻塞式的。

这是客户端

public class Client {
    public static void main(String[] args) {
        Scanner se=new Scanner(System.in);
        System.out.println("请输入客户端编号:");
        int code=se.nextInt();
        System.out.println("客户端编号是:"+code);
        Socket socket=null;

        try
        {
            System.out.println("客户端"+code+"开始连接服务器...");
            socket=new Socket("127.0.0.1",8888);
            if(socket!=null){
                System.out.println("客户端"+code+"连接服务器成功!");
            }
            OutputStream out= socket.getOutputStream();
            while (true){

                System.out.println("客户端"+code+"请输入要发送的内容:");
               String str=se.next();
               if(str.trim().equalsIgnoreCase("quit"))
                   break;
               out.write((code+"--->"+str).getBytes("utf-8"));
            }
            out.close();
            socket.close();


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

    }

  这是服务端

public class Server {
    private static  int port=8888;
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket=null;
                try{
                    serverSocket=new ServerSocket(port);
                    System.out.println("服务端开始监听:"+port);
                    while (true){
                     var clientSocket= serverSocket.accept();//第一处阻塞
                        System.out.println("接受一个客户端请求");
                        InputStream in=clientSocket.getInputStream();
                        int hasread=0;
                        byte[] bufer=new byte[1024];
                        while ((hasread=in.read(bufer))!=-1){//第二处阻塞
                            System.out.println("客户端输入字符:"+new String(bufer,0,hasread));
                        }
                        clientSocket.close();
                        in.close();
                    }

                }
                catch (Exception ex){
                    ex.printStackTrace();
                }finally {
                    try {
                        serverSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
    }

  服务端在监听客户端,和接收客户端时,是阻塞的状态。

单独把服务端运行

 程序阻塞在监听方法处

起一个客户端

 显示连接服务器成功

 此时服务器阻塞在读取客户端输入的文字处

 此时通信成功,然而程序时在不停的循环等待中。

此时在起一个客户端,并发送内容

 服务器是收不到内容的,因为他阻塞等待客户端1发送内容,此时把客户端1关停。

 

 服务端收到了客户端2的信息。

所以说,这个BIO是阻塞式的,要想实现多个客户端同时发送信息。需要多个线程。

原文地址:https://www.cnblogs.com/tomato190/p/12675202.html