Netty中的常用组件(四)

ChannelHandlerContext

  • Channel、ChannelPipeline和ChannelhandlerContext上的事件传播。ChannelHandlerContext有很多的方法,其中一些方法也存在于Channel和ChannelPipeline本身上,但是有一点重要的不同,如果调用Channel或者ChannelPipeline上的这些方法,它们将沿着整个
    ChannelPipeline进行传播。而调用位于ChannelHandlerContext上的相同的方法,则将从当前所关联的ChannelHandler开始,并且只会传播给位于该ChannelPipeline中的下一个(入站下一个,出站上一个)能够处理该事件的ChannelHandler
    Netty中的常用组件(四)_第1张图片

  • eg:比如服务器收到对端发过来的报文,解压后需要进行机密,结果解密失败,要给对端一个应答。如果发现解密失败 原因时服务器和对端的加密算法不一致,应答报文只能以明文的压缩格式发送,就可以在解密Handler中直接使用ctx.write给对端应答,这样应答报文就只会经过压缩Handler就发往了对端
    Netty中的常用组件(四)_第2张图片

  • ChannelHandlerContext的API
    alloc返回和这个示例相关联的Channel所配置的ByteBufAllocator
    bind绑定到给定的SocketAddress,并返回ChannelFuture
    channel返回绑定到这个实例的Channel
    close关闭Channel,并返回ChannelFuture
    connect连接给定的SocketAddress,并返回ChannelFuture
    deregister从之前分配的EventExecutor注销,并返回ChannelFuture
    disconnect从远程节点断开,并返回ChannelFuture
    executor返回调度时间的EventExecturo
    fireChannelActive触发对下一个ChannelInboundHandler上的channelActive()方法(已连接)的调用
    fireChannelInactive触发对下一个ChannelInboundHandler上的ChannelInactive()(已关闭)方法
    fireChannelRead触发对下一个ChannelInboundHandler上的channelRead()方法(已接收的消息)调用
    fireChannelReadComplete触发对下一个ChannelInboundHandler上的channelReadComplete()方法的调用
    fireChannelRegistered触发对下一个ChannelinboundHandler上的fireChannelRegistered()方法的调用
    fireChannelUnRegistered()触发对下一个ChannelInboundHandler上的fireChannelUnRegistered()方法的调用
    fireChannelWritablityChanged触发对下一个ChannelInboundHandler上的fireChannelWritabilityChanged()方法的调用
    fireChannelExceptionCaught()触发对下一个ChannelInboundHandler上的fireExceptionCaught()方法的调用
    fireUserEventTriggered触发对下一个ChannelInboundHandler上的fireUserEventTriggered(Object evet)方法的调用
    handler返回绑定到这个实例的ChannelHandler
    isRemoved如果所关联的ChannelHandler已经被从ChannelPipeline中移除则返回true
    name返回这个实例的唯一名称
    pipeline返回这个实例所关联的ChannelPipeline
    read将数据从Channel读取到第一个入站缓冲区,如果读取成功则触发一个channelRead事件,并(在最后一个消息被读取完成后)通知
    ChannelInboundHandler的channelReadComplte(ctx)方法
    write通过这个实例写入消息并经过ChannelPipeline
    writeAndFlush通过这个实例写入并冲刷消息并经过ChannelPipeline
    当使用ChannelHandlerContext的API的时候,有以下两点
    1.ChannelHandlerContext和ChannelHandler之间的关联(绑定)是永远不会改变的,所以缓存对它的引用是安全的
    2.相对于其他类的同名方法,ChannelHandlerContext的方法将产生更短的事件流,应该尽可能地利用这个特性来获得最大地性能

你可能感兴趣的:(Netty,java,Netty)