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

  • 相关阅读:
    Spark内核
    Scala(十一)泛型、项目案例
    离线数仓(一)
    SparkSparkCore(二)
    SharePoint 2013 Preview相关软件及必备组件下载地址
    SharePoint 2010 文档库AllItems.aspx页面出现乱码,打开即提示下载
    [SharePoint 2010]System.IO.FileLoadException: 找到的程序集清单定义与程序集引用不匹配
    '添加解决方案'这一部署步骤中发生错误:"未能提取解决方案中的 cab 文件"
    SharePoint 2010 BackupSPSite 备份网站集时报错 异常来自 HRESULT:0x80131904
    JSON介绍
  • 原文地址:https://www.cnblogs.com/tomato190/p/12675202.html
Copyright © 2011-2022 走看看