Dotnetty 源码之:handler如何区分InBound 还是 OutBound

    读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 了。

猜你喜欢

转载自blog.csdn.net/xhydongda/article/details/113825109
今日推荐