ChannelHandler及其实现类
- ChannelHandler是一个接口,处理IO事件或拦截IO操作,并将其转发到其ChannelPipeline(业务处理链)中的下一个处理程序。
- ChannelHandler本身并没有提供很多方法,因为这个接口有许多的方法需要实现,方便使用期间,可以维承它的子类
- ChannelHandler实现图
- 我们经常需要自定义一个Hander类去继承ChannellInboundHandlerAdapter,然后通过重写相应方法实现业务逻辑,需重写方法如下
Pipeline和ChannelPipeline
- ChannelPipeline是一个Handler的集合,它负责处理和拦截inbound或者outbound的事件和操作,相当于一个贯穿Netty的链。(也可以这样理解: ChannelPipeline是保存ChannelHandler的List,用于处理或拦截Channel的入站事件和出站操作)
- ChannelPipeline实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及Chamnel中各个的ChannelHandler如何相互交互
- 在 Netty 中每个Channel都有且仅有一个ChannelPipeline与之对应,它们的组成关系如下
- 一个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
- Netty在创建Channel实例后,都需要设置ChannelOption参数。
- ChannelOption参数如下:
- ChannelOption.SO_BACKLOG对应TCP/IP协议listen函数中的backlog参数,用来初始化服务器可连接队列大小。服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接。多个客户端来的时候,服务端将不能处理的客户端连接请求放在队列中等待处理,backlog 参数指定了队列的大小。
- ChannelOption.SO_KEEPALIVE一直保持连接活动状态