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