NIO基础之三大组件

一、 Channel

channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层。
channel 是有类型的,一个 string 的 channel 只能存放 string 类型数据。
可以通过Buffer作为容器,往Channel中取出数据或者添加数据。如果Channel是一个水缸,那Buffer就是打水的瓢。
image.png
常见的 Channel 有

  • FileChannel
  • DatagramChannel
  • SocketChannel
  • ServerSocketChannel

二、Buffer

buffer 则用来缓冲读写数据,使用buffer去对读取或者写入channel的数据,buffer就想读写文件时使用的那个数组一样,常见的 buffer 有

  • ByteBuffer
    • MappedByteBuffer
    • DirectByteBuffer
    • HeapByteBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer
  • CharBuffer

三、 Selector

Selector 一般称为选择器, 也可以翻译为多路复用器,它是 Java NIO 核心组件中的一个, 用于检查一个或多个 NIO Channel(通道)的状态是否处于可读、可写
可以实现单线程管理多个 channels, 相比使用多个线程, 避免了线程上下文切换带来的开销。
selector 的作用就是配合一个线程来管理多个 channel,获取这些 channel 上发生的事件,这些 channel 工作在非阻塞模式下,不会让线程吊死在一个 channel 上。适合连接数特别多,但流量低的场景(low traffic)
channel中会出现数据读取,在单线程中,多个channel的读取都是阻塞的,一个channel在等待客户端读取的过程中,会阻塞其他channel,如果使用多线程,对系统性能是一种挑战。
image.png
而selector,可以在单线程中也能对多个channel进行管理,通过channel事件监听的方式,调用 selector 的 select() 会阻塞直到 channel 发生了读写就绪事件,这些事件发生,select 方法就会返回这些事件交给 thread 来处理。
Selector 维护注册过的 Channel 集合, 并且这种注册关系被封装在 SelectionKey 中。selector可以自定义选择监听那些事件,可以绑定的事件类型有:
绑定的事件类型可以有

  • connect - 客户端连接成功时触发
  • accept - 服务器端成功接受连接时触发
  • read - 数据可读入时触发,有因为接收能力弱,数据暂不能读入的情况
  • write - 数据可写出时触发,有因为发送能力弱,数据暂不能写出的情况

猜你喜欢

转载自blog.csdn.net/qq_45171957/article/details/126079127