Netty4.1.x ChannelHandler
来源:互联网 发布:游戏直播软件 编辑:程序博客网 时间:2024/05/29 03:43
我们今天来看看ChannelHandler和其子类
1、ChannelHandler中的方法
Netty定义了良好的类型层次结构来表示不同的处理程序类型,所有的类型父类是ChannelHandler。
ChannelHandler提供了在其生命周期内添加或从ChannelPipeline中删除的方法。
- handlerAdded, ChannelHandler添加到实际上下文中准备处理事件
- handlerRemoved, 将ChannelHandler从实际上下文中删除,不再处理事件
- exceptionCaught, 处理抛出的异常
上面三个方法都需要传递ChannelHandlerContext参数,每个ChannelHandler被添加到ChannelPipeline时会自动创建ChannelHandlerContext。
ChannelHandlerContext允许在本地通道安全的存储和检索值。Netty还提供了一个实现了ChannelHandler的抽象类:ChannelHandlerAdapter。
ChannelHandlerAdapter实现了父类的所有的方法,基本上就是传递事件到ChannelPipeline中的下一个ChannelHandler直到结束。
2、ChannelInboundHandler
ChannelInboundHandler提供了一些方法再接收数据或Channel状态改变时被调用。下面就ChannelInboundHandler的一些方法:
- channelRegistered, ChannelHandlerContext的Channel被注册到EventLoop;
- channelUnregistered, ChannelHandlerContext的Channel从EventLoop中注销;
- channelActive, ChannelHandlerContext的Channel已激活
- channelInactive, ChannelHanderContext的Channel结束生命周期
- channelRead, 从当前Channel的对端读取消息
- channelReadComplete, 消息读取完成后执行
- userEventTriggered, 一个用户事件被处罚
- channelWritabilityChanged, 改变通道的可写状态, 可以使用Channel.isWriteable()检查
- exceptionCaught, 重写父类ChannelHandler的方法,处理异常
Netty提供了一个实现了ChannelInboundHandler接口并继承ChanelHandlerAdapter的类:
ChannelInboundHandlerAdapter。ChannelInboundHandlerAdapter实现了ChannelInboundHandler的所有方法,
作用就是处理消息并将消息转发到ChannelPipeline中的下一个ChannelHandler。
ChannelInboundHandlerAdapter的ChannelRead方法处理完消息后不会自动释放消息,若想自动释放收到的消息,可以
使用SimpleChannelInboundHandler<I>。
如果需要其他状态改变的通知,可以重写Handler的其他方法。通常自定义消息类型来解码字节,可以实现ChannelInboundHandler或
ChannelInboundHandlerAdapter。有一个更好的解决方法,使用编解码器的框架可以很容易实现。使用ChannelInboundHandler、
ChannelInboundHandlerAdapter、SimpleChannelInboundHandler这三个中的一个来处理接收消息,使用哪一个取决于需求;大多数时候使用
SimpleChannelInboundHandler处理消息,使用ChannelboundHandlerAdapter处理其他的“入站”事件或状态改变。
ChannelInitializer用来初始化ChannelHandler,将自定义的各种ChannelHandler添加ChannelPipeline中。
3、ChannelOutboundHandler
ChannelOutboundHandler用来处理“出站”的数据消息。ChannelOutboundHandler提供了下面的一些方法:
- bind,Channel绑定本地地址
- connect,Channel连接操作
- disconnect,Channel断开连接
- close,关闭Channel
- deregister,注销Channel
- read,读取消息,实际是截获ChannelHandlerContext,read()
- write,写打操作,实际是通过ChannelPipeline写消息,Channel.flush()属性到实际通道
- flush,刷新消息到通道
ChannelOutBoundHandler是ChannelHandler的子类,实现了ChannelHandler的所有方法。所有最重要的方法采取ChannelPromise,
因此一旦请求停止从ChannelPipeline转发参数则必须得到通知。Netty提供了ChannelOutboundHandler的实现:ChannelOutboundHandlerAdapter。
ChannelOutboundHandlerAdapter实现了父类的所有方法,并且可以根据需要重写感兴趣的方法。所有这些方法的实现,在默认情况下,都是通过调用
ChannelHandlerContext的方法将事件转发到ChannelPipeline中下一个ChannelHandler。
重要的是要记得释放并通知ChannelPromise,若ChannelPromise没有被通知可能会导致其中一个ChannelFutureLister不被通知去处理一个消息。
如果消息被消费并且没有被传递到ChannelPipeline中的一下ChannelOutboundHandler,那么就需要调用ReferenceCountUtil.release(message)来释放消息资源。
一旦消息被传递到实际的通道,它会自动写入消息或在通道关闭是释放。
0 0
- Netty4.1.x ChannelHandler
- Netty4.x中文教程系列 ChannelHandler
- Netty4.x中文教程系列(三) ChannelHandler
- Netty4.x中文教程系列(三) ChannelHandler
- Netty4.x中文教程系列(四) ChannelHandler
- Netty4实战第六章:ChannelHandler
- Netty4.1.X zero copy
- Netty4.x
- Netty4实战第八章:Netty提供的ChannelHandler和编解码器
- Netty4.x HelloWorld
- netty4.x入门教程
- netty4.x FixedChannelPool使用
- ChannelHandler
- ChannelHandler
- netty学习---Netty4.x用户指南
- netty4.0.x源码分析—event
- netty4.0.x源码分析—channel
- netty4.0.x源码分析—ChannelPipeline
- webpack样式处理
- 从机器学习谈起
- Spring Boot(十一)使用AOP,@Aspect统一处理Web请求日志
- Mac下的串口通信-ORSSerialPort
- 仿造饿了么下单按钮的自定义View
- Netty4.1.x ChannelHandler
- 鼠标滚轮事件及其兼容
- 应用题分析思路--关注点分离
- Codeforces 443C Borya and Hanabi【暴力+思维】
- Kafka--Caused by: kafka.common.ConsumerRebalanceFailedException
- 轮子系列:一款能用易用好用的Android图片轮播轮子
- Android N 之 重要的开发者功能
- 用79种语言说:我爱你
- linux cmake