Netty学习记录-入门篇( 五 )

实际开发过程中 , 在拿到channel之后 , 做一个判断 , 看是什么连接 , 如(channel instanceof SocketChannel/DatagramChannel) , 就可以做不同的业务处理 。
SelectorNetty基于Selector对象实现I/O多路复用 , 通过Selector一个线程可以监听多个连接的Channel事件 。当向一个Selector中注册Channel后 ,  Selector内部的机制就可以自动不断地查询(Select)这些注册的Channel是否有已就绪的I/O事件(例如可读 , 可写 , 网络连接完成等) ,  这样程序就可以很简单地使用一个线程高效地管理多个Channel 。
ChannelHandler 及其实现类ChannelHandler是一个接口 , 处理 I/O 事件或拦截 I/O 操作 , 并将其转发到其 ChannelPipeline(业务处理链)中的下一个处理程序
ChannelHandler及其实现类一览图:

Netty学习记录-入门篇

文章插图
- ChannelInboundHandler 用于处理入站 I/O 事件 。- ChannelOutboundHandler 用于处理出站 I/O 操作 。- ChannelInboundHandlerAdapter 用于处理入站 I/O 事件 。- ChannelOutboundHandlerAdapter 用于处理出站 I/O 操作 。- ChannelDuplexHandler 用于处理入站和出站事件 。Pipeline 和 ChannelPipelineChannelPipeline 是一个 Handler 的集合 , 它负责处理和拦截 inbound 或者 outbound 的事件和操作 , 相当于一个贯穿 Netty 的链 。(也可以这样理解:ChannelPipeline 是 保存 ChannelHandler 的 List , 用于处理或拦截 Channel 的入站事件和出站操作) 。
ChannelPipeline 实现了一种高级形式的拦截过滤器模式 , 使用户可以完全控制事件的处理方式 , 以及 Channel 中各个的 ChannelHandler 如何相互交互 。
在 Netty 中每个 Channel 都有且仅有一个 ChannelPipeline 与之对应 , 它们的组成关系如下:
Netty学习记录-入门篇

文章插图
一个 Channel 包含了一个 ChannelPipeline , 而 ChannelPipeline 中又维护了一个由 ChannelHandlerContext 组成的双向链表 , 并且每个ChannelHandlerContext中又关联着一个 ChannelHandler
入站事件和出站事件在一个双向链表中 , 入站事件会从链表 head 往后传递到最后一个入站的 handler , 出站事件会从链表 tail 往前传递到最前一个出站的 handler , 两种类型的 handler 互不干扰 。
常用方法:
- ChannelPipeline addFirst(ChannelHandler... handlers) , 把一个业务处理类(handler)添加到链中的第一个位置 。- ChannelPipeline addLast(ChannelHandler... handlers) , 把一个业务处理类(handler)添加到链中的最后一个位置 。ChannelHandlerContext保存Channel相关的所有上下文信息 , 同时关联一个ChannelHandler对象ChannelHandlerContext中包含一个具体的事件处理器ChannelHandler , 同时ChannelHandlerContext 中也绑定了对应的pipeline和Channel的信息 , 方便对ChannelHandler进行调用 。
常用方法:
- ChannelFuture close(): 关闭通道- ChannelOutboundInvoker flush(): 刷新- ChannelFuture writeAndFlush(Object msg): 将数据写到ChannelPipeline中当前ChannelHandler的下一个ChannelHandler开始处理 。ChannelOption