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学习记录-入门篇

文章插图
【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
  • ChannelOption.SO_BACKLOG
    • 对应TCP/IP协议listen函数中的backlog参数 , 用来初始化服务器可连接队列大小 。服务端处理客户端连接请求时顺序处理的,所以同一时间只能处理一个客户端连接 。多个客户端来的时候,服务器将不能处理的客户端连接请求放在队列中等待处理,backlog参数指定了队列的大小 。
  • ChannelOption.SO_KEEPALIVE
    • 一直保持连接活动状态 。
EventLoopGroup 和其实现类 NioEventLoopGroup
Netty学习记录-入门篇

文章插图
  • BoosEventLoopGroup通常是一个单线程的EventLoop , EventLoop维护着一个注册了ServerSocketChannel的Selector实例 , BossEventLoop不断轮询将连接事件分离出来 。
  • 通常是OP_ACCEPT事件,然后将接收到的SocketChannel交给WorkerEventLoopGroup
  • WorkerEventLoopGroup会由next选择其中一个EventLoop来将这个SocketChannel注册到其维护的Selector并对其后续的IO事件进行处理 。
常用方法:

推荐阅读