ChannelHandler 分类

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

ChannelHandler 分类

在 Netty 中,ChannelHandler 是一个关键的接口,它定义了处理 I/O 事件或拦截 I/O 操作的方法。一个 ChannelHandler 可以与一个或多个 ChannelPipeline 相关联,用于处理进出站的数据和事件。

ChannelHandler 接口有多个实现,主要可以分为两大类:

入站处理器(Inbound Handler)

入站处理器主要处理入站数据和事件。这些处理器实现了 ChannelInboundHandler 接口,它是 ChannelHandler 的子接口。入站处理器的常见任务包括:

  • 读取数据(例如,从 socket 接收数据)

  • 数据解码

  • 触发事件(例如,连接建立或断开)

  • 异常处理

常见的入站处理器

  • ChannelInboundHandlerAdapter

  • SimpleChannelInboundHandler

  • ByteToMessageDecoder

  • StringDecoder

出站处理器(Outbound Handler)

出站处理器主要负责处理出站操作,如写数据到 socket。这些处理器实现了 ChannelOutboundHandler 接口,它也是 ChannelHandler 的子接口。出站处理器的常见任务包括:

  • 数据编码

  • 数据写入

  • 关闭连接

常见的出站处理器

  • ChannelOutboundHandlerAdapter

  • MessageToByteEncoder

  • StringEncoder

组合处理器(Combined Handler)

有些处理器同时实现了入站和出站处理器的功能,这些处理器可以同时处理入站和出站事件。例如,ByteToMessageCodec 是同时实现了 ByteToMessageDecoderMessageToByteEncoder 的功能。

常见的组合处理器

  • ByteToMessageCodec

  • MessageToMessageCodec

使用 ChannelHandler

在 Netty 中,处理器是通过 ChannelPipeline 来管理的。每个 Channel 都有一个与之关联的 ChannelPipeline,它代表了一个处理器链。在这个链中,可以添加或删除处理器,以实现复杂的网络协议处理。

添加处理器到 ChannelPipeline

ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast("myHandler", new MyChannelHandler());

移除处理器

pipeline.remove("myHandler");

替换处理器

pipeline.replace("myHandler", "newHandler", new MyNewChannelHandler());

处理器的生命周期

ChannelHandler 有一系列的生命周期方法,这些方法可以被重写以执行特定的动作:

  • handlerAdded(ChannelHandlerContext ctx):当处理器被添加到 ChannelPipeline 时调用。

  • handlerRemoved(ChannelHandlerContext ctx):当处理器从 ChannelPipeline 移除时调用。

  • exceptionCaught(ChannelHandlerContext ctx, Throwable cause):处理过程中发生异常时调用。

通过正确地管理这些生命周期方法,可以确保资源被适当地释放,以及在处理器被添加或移除时执行必要的初始化或清理工作。

最后更新于