BIO

作者: 昨日已逝去 | 来源:发表于2019-01-17 17:23 被阅读48次

    BIO

    概述

    <div id = "description"></div>
    Java BIO (blocking I/O): 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

    bio.png

    当一个客户端请求服务端,服务端接受到一个请求后会创建一个socket并开启一个线程处理这个socket,再处理的同时,客户端必须等待服务端的响应。

    <div id = "service"></div>

    服务端

    代码演示:

         while (true) {
                Socket socket = serverSocket.accept();
                new Thread(new ServerHander(socket)).start();
            }
    

    这里accept方法会阻塞,当有客户端发起请求才会往下执行,进行数据读取,读取完毕通过socket中的outStream返回给客户端处理后的结果。

                while (true) {
                    if ((tmp=bufferedReader.readLine())!=null) {
                        System.out.println("本次读取内容为:"+ tmp);
                        out.println("已收到你的消息");
                    }else {
                        break;
                    }
                }
    

    <div id = "client"></div>

    客户端

    前面说过客户端发出消息后会一直阻塞等待服务端的响应,所以客户端必须有一个阻塞方法,下面来看下客户端的阻塞方法。

                while (true) {
                    if ((tmp = bufferedReader.readLine()) !=null) {
                        System.out.println(tmp);
                    }else {
                        break;
                    }
                }
    

    bufferedReader.readLine()在服务端没有返回信息前一直阻塞,当有数据进入时,会向下执行。
    <div id = "good"></div>

    bio的优点

    • 1.模型简单
    • 2.编码简单
      <div id = "bad"></div>

    bio的缺点

    • 1.每次客户端来都必须开启一个线程做处理。
    • 2.客户端线程必须被阻塞,浪费大量资源。
    • 3.线程之间大量上下文的切换。

    相关文章

      网友评论

          本文标题:BIO

          本文链接:https://www.haomeiwen.com/subject/rngidqtx.html