读Dotnetty代码时,发现所有 handler 的根是 IChannelHandler 接口,这个接口里面的方法是按照 InBound,OutBound 分组的:
InBound方法:
- ChannelActive
- ChannelInactive
- ChannelRead
- ChannelReadComplete
- ChannelRegistered
- ChannelUnregistered
- ChannelWritabilityChanged
- UserEventTriggered
- ExceptionCaught
OutBound方法:
- BindAsync
- CloseAsync
- ConnectAsync
- DeregisterAsync
- DisconnectAsync
- Flush
- Read
- WriteAsync
ChannelHandlerAdapter 作为 IChannelHandler 的默认实现,上述方法均被标记为 [Skip],进而在 AbstractChannelHandlerContext 中使用该标记来生成枚举 SkipFlags,该枚举类型中给出了 InBound 和 OutBound 的取值为上述方法枚举值的或,也就是说,判断一个 handler 是InBound 还是OutBound 就看该 handler 的上述方法中是否有 没有被标记为 [Skip] 的重载。
解码作为典型的InBound hanlder,我们从其基类 ByteToMessageDecoder 可以看到,ChannelInactive ChannelRead ChannelReadComplete 这几个 InBound 方法被 override 了。
编码作为典型的OutBound handler,我们从其基类 MessageToByteEncoder 可以看到,WriteAsync 方法被 override 了。