1.NIO的职责
Selector负责事件分发,当有事件到达时,Channel向Selector注册,并通过Buffer进行数据交互
2.Selector注册事件
API
- SelectorKey.OP_CONNECT 连接就绪
- SelectorKey.OP_ACCEPT 接收就绪
- SelectorKey.OP_READ 读就绪(新数据到达)
- SelectorKey.OP_WRITE 写就绪
使用流程
- open() 开启一个选择器,可以给注册器注册需要关注的事件
- register() 将一个Channel注册到选择器,将选择器触发对应关注事件时回调到Channel中,处理相关数据
- select()/selectNow() 一个通道Channel,处理一个当前可用、待处理的通道的数据,即阻塞等待Selector上的事件
- selectdKeys() 返回Selector上所有就绪状态的事件
- wakeUp() 唤醒一个处于select状态的选择器
- close() 关闭一个选择器,注销所有关注事件
注意事项
- 注册到选择器的通道必须为非阻塞状态
- FileChannel不能用于Selector 因为FileChannel不能切换为非阻塞模式;套接字通道可以
3. SelectionKey选择键
每个Channel向Selector注册时,都将会创建一个selectionKey作为标识
- Interest集合:所有注册事件的集合
- Ready集合:所有就绪事件的集合
- Channel通道
- Selector选择器
- obj附加值