NIO-API

Buffer:

  1. 缓冲区,用于数据处理的基础单元,客户端发送与接收数据都需要通过Buffer转发进行。
  2. 包括:ByteBuffer,CharBuffer,ShortBuffer…
  3. 与传统不同,写数据时先写到Buffer->Channel->发送。读则反之。
  4. 为NIO块状操作提供基础,数据都按块进行传输,底层是数组来实现。

Channel:

  1. 通道,真实的用于数据的发送与读取的通道。类似与流,但不同于in\out stream;流具有独占性与单向性,而通道则可以通过Buffer来偏向于数据的流通多样性。
  2. 可以从通道中获取数据,也可以向通道中输入数据,且按照Buffer进行的。
  3. 包括FileChannel,SocketChannel,ServerSocketChannel,DatagramChannel等

Selector:

  1. 选择器,处理客户端所有事件的分发器。
  2. 首先要注册一个Channel的事件到Selector,例如向Selector中注册Channel的可读事件,这时Selector就会关注这个Channel的可读状态,当网卡接收到了数据传给Channel,Channel就可读了,这时就会被Selector监听到,然后我们可以在Channel中读数据到Buffer中。

Selector注册事件

  1. SelectionKey.OP_CONNECT 连接就绪,Socket的连接需要3次握手,我们可以先把Channel的OP_CONNECT事件注册到Selector上,连接的过程中我们可以不必等待,可以去处理别的事情,当3次握手成功时,在由Selector告知我们,进行下一步。OP_CONNECT 没有实际的数据报文传输,只是系统层面的连接。
  2. SelectionKey.OP_ACCEPT接收就绪,当有客户端连接服务端时这个事件就会被触发。
  3. SelectionKey.OP_READ 读就绪,有数据来了会触发。
  4. SelectionKey.OP_WRITE写就绪,当前的网卡是可以输出数据的。

Selector的使用

  1. open() 开启一个选择器
  2. register()将一个Channel注册到选择器,当选择器触发对应关注的事件时回调到Channel中,处理相关数据。
  3. select()/selectNow() 注册的事件被触发了,并不会同时回送给我们,我们需要遍历这个池子,用select()/selectNow()就是遍历池子,这个方法是阻塞的,阻塞到有事件触发的时候。例如,当前第一个Channel读可用,第二个Channel写可用,select()后我们拿到的是一个集合。
  4. selectedKeys() 得到当前就绪的通道selector.selectedKeys() ,返回Set<SelectionKey> ,SelectionKey的属性:① Interest是所有事件的集合,②Ready是可用的集合③channel 注册事件的channel④selector选择器⑤obj附加值,在注册事件的时候可以加一个附加值,在事件就绪的时候可以取出来。
  5. wakeUp() 唤醒处于阻塞的选择器,返回的数量是0
  6. close() 关闭一个选择器,注销所有的关注事件

Selector的注意事项

  1. 注册到选择器的Channel必须是非阻塞状态
  2. FileChannel不能注册到Selector上,FileChannel不能切换为非阻塞模式。文件什么时候都可以读,写只是受限于磁盘的IO速度,一定是一个阻塞状态的。

在这里插入图片描述

①避免了一个客户端建立一个读线程,一个写线程。多个Channel注册到一个Selector上,实现了一个线程就可以实现多个客户端的读写操作。
②有Select的监听就避免了IO阻塞的等待。

扩展部分: Charset

  1. 可以将Buffer里的数据进行加密、解密
  2. data->Buffer->Charset
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值