JavaIO:BIO、NIO-创新互联

3种网络编程 I/O 模型:BIO、NIO、AIO

成都创新互联公司是专业的射阳网站建设公司,射阳接单;提供成都网站设计、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行射阳网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
  • BIO:同步并阻塞(传统阻塞型),一个连接一个线程,连接数目比较小且固定的架构场景
  • NIO:同步非阻塞,一个线程处理多个连接,连接数目多且连接比较短的架构场景
  • AIO:异步非阻塞,Proactor 模式,有效请求才启动线程,连接数较多且连接时间较长场景
BIO(blocking I/O)
  • 基本介绍:传统的 Java IO 编程
  • BIO:同步阻塞
  • 简单流程
    • 服务器启动一个 ServerSocket
    • 客户端启动一个 Socket 进行通信,默认每个客户端建立一个线程进行通讯
    • 客户端发起请求后先咨询服务器是否有线程响应,没有就等待或者被拒绝
      • 有响应,客户端线程会等待请求结束后,再继续执行
NIO(Java non-blocking IO)
  • 三大核心部分:Channel、Buffer、Selector
    • 每个 Channel 会对应一个 Buffer
    • Selector 对应一个线程,一个线程对应多个 Channel(连接)
    • Selector 切换到哪个 Channel 由事件决定,Event 就是一个重要概念
    • Selector 会根据不同的事件,在各个通道上切换
    • Buffer 就是一个内存块,底层有一个数组
    • 数据的读取写入是通过 Buffer(BIO 要么是输入或者输出流,不能双向,但是NIO的 Buffer 可以读也可以写,需要 flip 切换)
    • Channel 是双向的,可以返回底层操作系统的情况,比如 Linux,底层的操作系统通道就是双向的
  • NIO 面向缓冲区或者面向块
  • 基本介绍
    • 使用线程从某通道发送请求或者读取数据,仅能获取目前可用的数据,如果目前没有数据可用,就什么都不会获取,而不是保持线程阻塞
    • 通俗理解:用一个线程处理多个操作
    • HTTP2.0 使用了多路复用的技术,做到同一个连接并发处理多个请求,比HTTP1.1大了好几个数量级
  • NIO 和 BIO
    • BIO 以流处理数据,NIO 以块处理数据,块 I/O 效率比流 I/O 高很多
    • BIO 阻塞,NIO 非阻塞
    • BIO 基于字节流和字符流进行操作,NIO 基于 Channel 和 Buffer 进行操作,数据总是从通道读取到缓冲区,或者从缓冲区写入通道中
      • Selector 用于监听多个通道的事件(连接请求,数据到达),所以单个线程能监听多个客户端通道
  • 缓冲区(Buffer)
    • 本质上就是一个可以读写的内存块,理解成一个容器对象(含数组)
    • 缓冲区对象内置流一些机制,能够跟踪和记录缓冲区的状态变化情况
    • 属性
      • Capacicty:容量,缓冲区创建的时候被设定并且不能改变
      • Limit:当前终点,不能对缓冲区超过极限的位置进行读写操作,且极限是可以修改的
      • Position:位置,下一个要被读或写的元素的索引,每次读写缓冲区数据时都会改变的值,为下次做准备
      • Mark:标记
  • 通道(Channel)
    • NIO 通道类似于流
      • 可以同时读写,流只能读或者写
      • 可以实现异步读写数据
      • 可以从缓冲读数据,可以写数据到缓冲
    • BIO 中的 stream 是单向的,NIO 中的 Channel 是双向的可读写
    • Channel 在 NIO 中时一个接口,常用 FileChannel、DatagramChannel、ServerSocketChannel、SocketChannel
      • FileChannel:用于文件的读写
      • DatagramChannel:用于 UDP 的数据读写
      • ServerSocketChannel、SocketChannel 用于 TCP 的数据读写
  • 选择器(Selector)
    • 基本介绍
      • Selector 能够检测多个注册的通道上是否有事件发生,有就获取事件然后针对每个事件进行相应的处理
      • 只有在连接真正有读写事件发生时,才会进行读写,减少开销
      • 避免多线程之间的上下文切换导致的开销
    • Selector、SelectionKey、ServerSocketChannel、SocketChannel 关系
      • 客户端连接时,会通过 ServerSocketChannel 得到 SocketChannel
      • Selector 开始监听
      • 将 SocketChannel 注册到 Selector 上,一个 Selector 可以注册多个 SocketChannel
      • 注册后返回一个 SelectionKey 会和该 Selector 关联(集合)
      • Selector 进行监听 select 方法,返回有事件发生的通道个数
      • 进一步得到各个 SelectionKey(有事件发生)
      • 再通过 SelectionKey 反向获取 SocketChannel
      • 可以通过 channel() 方法得到 channel,完成业务处理
    • SelectionKey
      • 表示 Selector 和网络通道的注册关系
        • OP_ACCEPT:有新的网络连接可以 accept,值为 16
        • OP_CONNECT:代表连接已经建立,值为 8
        • OP_WRITE:代表写操作,值为 4
        • OP_READ:代表读操作,值为 1
    • ServerSocketChannel
      • 在服务器端监听新的客户端 Socket 连接
      • 相关方法
        • open:得到一个 ServerSocketChannel 通道
        • bind:设置服务器端口号
        • configureBlocking:设置阻塞或非阻塞模式
        • accept:接受一个连接
        • register:注册一个选择器并设置监听事件
    • SocketChannel
      • 网络 IO 通道,具体负责进行读写操作,NIO 把缓冲区的数据写入通道,或者把通道数据写入缓冲区
      • 相关方法
        • open
        • configureBlocking
        • connect
        • finnishConnect
        • write
        • read
        • register
        • close
  • 存在问题
    • NIO 类库和 API 繁杂,需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等
    • 需要具备 Java 多线程编程,NIO 编程涉及 Reactor 模式,必须对多线程和网络编程非常熟悉才能写出高质量的 NIO 程序
    • 开发工作量和难度都非常大,例如:临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流
    • NIO Bug:Epoll Bug,导致 Selector 空轮询,CPU 100%

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前文章:JavaIO:BIO、NIO-创新互联
地址分享:http://scyanting.com/article/hhjij.html