• 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是阻塞式的,要想实现多个客户端同时发送信息。需要多个线程。

  • 相关阅读:
    Spring创建对象的原理
    java.io.WriteAbortedException异常
    在servlet中返回json数据
    Java中导入导出Excel -- POI技术
    Java文件下载
    MySql 分页关键字(limit)
    从dao层查出的数据到页面时数值都是零的异常
    注解
    事务的四大特性
    Java-事务管理
  • 原文地址:https://www.cnblogs.com/tomato190/p/12675202.html
Copyright © 2020-2023  润新知