前言:1.由于工作需要,需要学习下Netty框架,随对学习进行整理。方便后期的翻阅。大家也可以借鉴下。
2.学习基于尚硅谷的Netty视频教程,笔记也会查阅其他资料来完善观看视频中本人理解模糊的地方。
了解Selector
1.Java的NIO,用非阻塞的IO方式,就可以用一个线程,处理多个客户端连接,就需要使用到Selector(选择器)
注意:NIO 有两种模式,阻塞模式和非阻塞模式,需要手动设置configureBlocking(false);为非阻塞模式,才可以使用选择器。
2.多个Channel以事件的方式可以注册到同一个Selector上,Selector 能够检测 多个已注册的通道上是否有事件发生,
如果有事件发生,便获取事件然后针对每个事件进行相应的处理,这样就可以只用一个线程去管理多个通道,也就是管理多个连接和请求
3.只有在连接真正有读写事件发生时,才会进行读写,就大大地减少了系统开销,并且不必为每个连接创建一个线程,不用去维护多个线程,
4.避免了多线程之间的上下文切换导致的开销
Selector类相关方法:
Selector类是一个抽象类,常用方法和说明如下:
//1.得到一个选择器
public static Selector open()
//2.监控所有注册的通道,当其中有IO操作可以进行 时,将对应的SelectionKey加入到内部稽核并返回,
//参数用来设置超时时间。如果一直没有IO操作,线程会等待 timeout 的时间。
public int select(long timeout)
//3.不会阻塞的方法,立即返回结果!
public int selectNow()
//4.当有IO操作后,通过调用 selectedKeys方法获取等待操作的selectedKey集合
public Set<SelectionKey> selectedKeys()
Selector大致使用流程就是,
1.创建通道Channel,
2.创建Selector:public static Selector open()
3.Channel开启非阻塞模式:configureBlocking(false)
4.创建的Channel注册到Selector上,并设置关心的事件:Channel.register(selector, SelectionKey.OP_ACCEPT);
5.Selector 对象的 public int select(long timeout)方法监听 注册的通道 有没有触发对应事件
6.检测到事件之后 通过调用 public Set<SelectionKey> selectedKeys()方法 获取触发了事件的SelectionKey集合
7.遍历SelectionKey,可以从中获取对应的通道对象,和触发的事件,再进行对应的业务处理即可
注册事件时,关心事件的选择有以下四种
OP_ACCEPT:新连接 值:16
OP_CONNECT:连接已建立 值:8
OP_READ:读 值:1
OP_WRITE:写 值:4
具体的代码演示将放在下一节中演示!本章只了解一下Selector机制和常用的方法!
思考:通道注册到Seletor上只能设置一个事件嘛?那我多个事件需要处理怎么办?(本人学到当前阶段的一个疑问,将在后续学习中解惑,并记录到文章中)