博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NIO
阅读量:6994 次
发布时间:2019-06-27

本文共 1530 字,大约阅读时间需要 5 分钟。

NIO中各个概念介绍

Buffer缓冲区

  1. 用户数据处理的基础单元,nio中的数据操作都是以块状的方式进行的,客户端发送与接受数据都通过Buffer转发进行(在nio中)
  2. Buffer包括ByteBuffer、CharBuffer、ShortBuffer等
  3. 写数据:Buffer->Channel,读数据:将数据从Channel读到Buffer

Channel通道

  1. Channel类似于流, 但有不同于传统的输入输出流,传统的输入输出流具有独占性和单向性,通道则偏向于数据流通的多样性。
  2. 可以从通道中读取数据也可将数据写到通道,数据单位按块进行.
  3. 可并发可异步读写数据,一般对于读是独占的,对于写也是独占的,同时进行读或同时进行写可能导致读取的文件乱码,但是读和写之间可以异步进行。
  4. 读数据读到Buffer,写数据也要通过Buffer写
  5. Channel包括FileChannel、SocketChannel、DatagramChannel等

Selectors选择器

处理客户端所有事件的分发器

  1. 向Selector注册事件,当Channel满足某个状态的时候事件被触发,例如如当channel为可读状态(即有数据到达时)触发事件,然后将数据读取到Buffer中。

Selector使用流程

  1. open()开启一个选择器,可以给选择器注册需要关注的事件
  2. register()将一个Channel注册到选择器,当选择器触发对应关注事件时回调到Channel中,处理相关数据。
  3. select()/selectNow():Selector是一个半观察者模式,当事件到达时,Selector需要自己区遍历池子区找到就绪事件,调用select()/selectNow()即可遍历,去处理当前可用的、待处理的通道数据,返回的是待处理事件的集合
  4. selectKeys()的到当前就绪的通道
  5. wakeUp()唤醒一个处于select状态的选择器
  6. close()关闭一个选择器,所有注册事件都被注销

Selector注意事项

  1. 注册到选择器的通道必须处于非阻塞状态
  2. FileChannel不能用于Selector,因为FileChannel不能切换为非阻塞模式,读取文件用于都是堵塞状态,它一直都是可读的,套接字通道可以

Selector SelectionKey

1.Interest集合、Ready集合 2. Channel通道 3. Selector选择器 4. obj附加值

四个基本事件

  1. SelectionKey.OP_CONNECT连接就绪
    当客户端想要连接到服务器的时候,连接需要经过TCP的三次握手,建立连接是一个耗时的操作,客户端想要等待连接建立好以后再进行后续的数据操作,但是当你要写数据的时候,网卡也有可能处于繁忙状态,要等待网卡空闲时数据才能被发出去,这时我们就需要注册一些写的事件
  2. SelectionKey.OP_ACCEPT : 接受就绪 当客户端发送一个连接到服务器端时,服务器端会收到客户端的连接到来,服务端可以选择拒绝客户端连接或建立连接,当客户端连接正常建立好以后,服务器端就会收到连接就绪,服务器端首先要注册一个接受就绪的事件,当有客户端来连接的时候触发事件
  3. SelectionKey.OP_READ 读就绪
    读数据即有数据到来
  4. SelectionKey.OP_WRITER 写数据

Charset扩展部分

  • Charset字符编码: 加密、解密
  • 原生支持的、数据通道级别的数据处理方式,可以用于数据传输级别的数据加密、解密等操作.

NIO服务器

转载于:https://juejin.im/post/5cf641c9e51d4550bf1ae814

你可能感兴趣的文章