NIO核心

  • Channel:通道
  • Buffer:缓冲区
  • Selector:选择器 或 多路复用器

    Channel 通道 简介

    可以类比BIO中流的概念,但与流不同的是:流是单向输出输入,而Channel是双向性的,既可以读,也可以写

  • 双向性

  • 非阻塞性
  • 操作唯一性

    在NIO中操作Channel的唯一方式是Buffer,通过Buffer实现数据块的读写,是基于数据块的操作

    Channel实现

  • 文件类:FileChannel

  • UDP类:DatagramChannel
  • TCP类:ServerSocketChannel /SocketChannel

    Socket回顾

    image.png

    Channel使用

    1. //代码片段1:服务端通过服务端socket创建channel
    2. ServerSocketChannel serverChannel=ServerSocketChannel.open();
    3. //代码片段2:服务器端绑定端口
    4. serverChannel.bind(new InetSocketAddress(port));
    5. //代码片段3:服务器端监听客户端连接,建立socketChannel连接
    6. SocketChannel accept = serverChannel.accept();
    7. //代码片段4:客户端连接远程主机及端口
    8. SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8080));

    Buffer(缓冲区)简介

  • 作用:读写Channel中的数据

  • 本质:一块内存区域

    Buffer属性

  • Capacity:容量

    1. (表明缓冲区最大能容纳多少字节,一旦写入的字节数超过容量,需要将其清空后才能继续向里面写入数据)
  • Position:位置

    1. 当写入数据时,初始的位置为0,当一个data写入到buffer后,Position会向后移动到下一个可插入数据的Buffer单元,Position最大为:容量-1<br /> 当读取数据时,Buffer会从写模式切换到读模式,此时buffer会被重置为0,当从Buffer读取数据时,Position会向后移动到下一个可读的位置
  • Limit:上限

    在写模式下,Buffer的Limit会最多往Buffer中写多少数据,此模式下,Limit等于Capacity
    当切换到读模式时,Limit表示最多能从Buffer中读取多少数据,此时Limit会被设置成写模式下的Position值

  • Mark:标记

    1. mark存储一个特定的Position位置,之后可以通过调用Bufferresite方法,可以恢复到这个Position位置,依然可以从这个位置处理数据

    Buffer使用

    image.png
    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

    Selector-选择器-简介

  • 作用:I/O就绪选择

  • 地位:NIO网络编程的基础

selector是Java NIO中能够检测1到多个NIO 通道(Channel),并能够知晓通道是否为注入读写 事件做好准备的组件,通过selector,一个单独的线程就可以管理 多个Channel,从而管理多个网络连接

selector使用

  1. /**
  2. * 代码片段1:创建Selector
  3. */
  4. Selector selector = Selector.open();
  5. //代码片段2:将channel注册到selector上,监听读就绪事件
  6. SelectionKey register = serverChannel.register(selector, SelectionKey.OP_READ);
  7. //代码片段3:阻塞等待channel有就绪事件发生
  8. int select = selector.select();
  9. //代码片段4:获取发送就绪事件的channel集合
  10. Set<SelectionKey> readyKeys = selector.selectedKeys();

SelectionKey简介

四种就绪状态常量

  • OP_READ 读
  • OP_WRITE 写
  • OP_CONNECT 连接
  • OP_ACCEPT 接收

    有价值的属性

    NIO编程实现步骤

  • 第一步:创建Selector

  • 第二步:创建ServerSocketChannel,并绑定监听端口
  • 第三步:将Channel设置为非阻塞模式(重要)
  • 第四步:将Channel注册到Selector上,监听连接事件
  • 第五步:循环调用Selector的select方法,检测就绪情况
  • 第六步:调用selectedKeys方法获取就绪channel集合
  • 第七步:判断就绪事件种类,调用业务处理方法
  • 第八步:根据业务需要决定是否再次注册监听事件,重复执行第三步操作