BIO

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.线程之间大量上下文的切换。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。