前言
在使用Netty进行网络编程的时候,通常需要在网络连接的不同阶段进行相应的操作,比如在连接建立时,客户端向服务端发起认证,在接收到数据时对数据内容进行解析等等。那么,连接的不同阶段在netty中如何表示呢?
首先我们先分析下网络连接的生命周期:连接建立 —> 数据交互 —> 连接断开。
在数据交互阶段,包括从连接中读取数据和向连接中写入数据。知道了连接的生命周期,就可以按图索骥的在各个阶段进行想要的操作。
而在 Netty 中,网络连接的不同生命周期都可以通过回调的方式来绑定相应的逻辑,这个回调接口就是ChannelHandler
,这里以 ChannelInboundHandler
为例分析。
主要接口
ChanneHandler
的类依赖关系图
通过上面的类结构图,我们总结一下规律:
ChannelHandler
有两个子接口,分别是ChannelInboundHandler
和ChannelOutboundHandler
,其实从字面意思就能知道,它们分别是入站和出站的接口类。- 如果我们自定义的业务 Handler 直接实现
ChannelInboundHandler
或者ChannelOutboundHandler
,那么我们需要实现的接口非常的多,增加了开发的难度。Netty 已经帮我们封装好了两个实现类,分别是ChannelInboundHandlerAdapter
和ChannelOutboundHandlerAdapter
,这样可以大大简化了开发工作。
SimpleChannelInboundHandler
也可以,额外添加了几种方法
核心生命周期方法
在ChannelInboundHandler
中定义了如下和生命周期相关的接口:
方法 | 描述 |
---|---|
channelRegistered | channelRegistered 注册成功时触发 |
channelUnregistered | channel 取消注册时触发 |
channelActive | channel 连接就绪时触发 |
channelInactive | channel 断开时触发 |
channelRead | channel 有数据可读时触发 |
channelReadComplete | channel 有数据可读,并且读完时触发 |
加上在父类ChannelHandler
中定义的两个:
方法 | 描述 |
---|---|
handlerAdded | Handler 被加入 Pipeline 时触发(仅仅触发一次) |
handlerRemoved | handler 被从 Pipeline 移除时触发 |
这些回调接口的调用顺序是什么呢? 我们通过写一个LifeCycleHandler
来看下ChannelInboundHandler
的生命周期的顺序。
public class LifeCycleInBoundHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRegistered(ChannelHandlerContext ctx)