`
stephen830
  • 浏览: 3009862 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

InBoundHandler和OutBoundHandler

阅读更多

 

一个Inbound事件通常由Inbound handler来处理。一个Inbound handler通常处理在IO线程产生的Inbound数据。Inbound数据通过真实的输入操作如 SocketChannel#read(ByteBuffer)来获取。如果一个inbound事件越过了最上面的inbound handler,该事件将会被抛弃到而不会通知你或者如果你需要关注,打印出日志。

  一个outbound事件由outbound handler来处理。一个outbound handler通常由outbound流量如写请求产生或者转变的。如果一个outbound事件越过了底部的outbound handler,它将由channel关联的IO线程处理。IO线程通常运行的是真实的输出操作如 SocketChannel#write(byteBuffer).

示例,假设我们创建下面这样一个pipeline:

 ChannelPipeline} p = ...;
 p.addLast("1", new InboundHandlerA());
 p.addLast("2", new InboundHandlerB());
 p.addLast("3", new OutboundHandlerA());
 p.addLast("4", new OutboundHandlerB());
 p.addLast("5", new InboundOutboundHandlerX());

  在上例中,inbound开头的handler意味着它是一个inbound handler。outbound开头的handler意味着它是一个outbound handler。上例的配置中当一个事件进入inbound时handler的顺序是1,2,3,4,5;当一个事件进入outbound 时,handler的顺序是5,4,3,2,1.在这个最高准则下,ChannelPipeline跳过特定handler的处理来缩短stack的深 度:

  3,4没有实现ChannelInboundHandler,因而一个inbound事件的处理顺序是1,2,5.

  1,2没有实现ChannelOutBoundhandler,因而一个outbound事件的处理顺序是5,4,3

  若5同时实现了ChannelInboundHandler和channelOutBoundHandler,一个inbound和一个outbound事件的执行顺序分别是125和543.

  一个事件跳向下一个handler

  如上图所示,一个handler触发ChannelHandlerContext中的事件传播方法,然后传递到下一个handler。这些方法有:

  inbound 事件传播方法:

  

 
      ChannelHandlerContext#fireChannelRegistered()
      ChannelHandlerContext#fireChannelActive()
      ChannelHandlerContext#fireChannelRead(Object)
      ChannelHandlerContext#fireChannelReadComplete()
      ChannelHandlerContext#fireExceptionCaught(Throwable)
      ChannelHandlerContext#fireUserEventTriggered(Object)
      ChannelHandlerContext#fireChannelWritabilityChanged()
      ChannelHandlerContext#fireChannelInactive()
      ChannelHandlerContext#fireChannelUnregistered()
 

 

  outbound事件传播方法:

 
ChannelHandlerContext#bind(SocketAddress, ChannelPromise)
ChannelHandlerContext#connect(SocketAddress, SocketAddress, ChannelPromise)
ChannelHandlerContext#write(Object, ChannelPromise)
ChannelHandlerContext#flush()
ChannelHandlerContext#read()
ChannelHandlerContext#disconnect(ChannelPromise)
ChannelHandlerContext#close(ChannelPromise)
ChannelHandlerContext#deregister(ChannelPromise)
 

下面的示例展示了事件是如何传播的:

 
  public class MyInboundHandler extends ChannelInboundHandlerAdapter {
      @Override
      public void channelActive(ChannelHandlerContext} ctx) {
          System.out.println("Connected!");
          ctx.fireChannelActive();
      }
  }
 
  public clas MyOutboundHandler extends ChannelOutboundHandlerAdapter {
      @Override
      public void close(ChannelHandlerContext} ctx, ChannelPromise} promise) {
          System.out.println("Closing ..");
          ctx.close(promise);
      }
  }

 

 

分享到:
评论

相关推荐

    netty的视频90集

    - ChannelHandler:处理网络事件和I/O操作的接口,分为InboundHandler和OutboundHandler。 - 事件循环(EventLoop):每个Channel都关联一个事件循环,负责调度和执行事件处理任务。 - 事件生命周期:连接建立、...

    netty4.0 demo

    有InboundHandler和OutboundHandler之分,分别处理接收和发送的数据。 7. **pom.xml 文件** 在Java项目中,pom.xml是Maven项目的配置文件,用于管理依赖关系。在Netty demo中,它会包含Netty库和其他可能的依赖库...

    NIO和Netty框架的学习

    1. **ChannelHandler**:处理网络事件的核心接口,分为InboundHandler和OutboundHandler。 2. **ByteBuf**:Netty的缓冲区实现,比Java NIO的ByteBuffer更加强大和灵活。 3. **Pipeline**:每个Channel都有一个...

    Netty 3中文版

    - **ChannelHandler**: ChannelHandler是处理I/O事件的核心组件,分为InboundHandler和OutboundHandler,分别处理输入和输出事件。 - **BossGroup和WorkerGroup**: Netty中的线程组,BossGroup负责接收新的连接,...

    netty源码深入分析

    5. **ChannelHandler**:ChannelHandler是用于处理特定类型事件的接口,可以实现InboundHandler或者OutboundHandler接口来处理入站或出站事件。 ### 关键技术点详解 #### 1. Bootstrap配置 Bootstrap是启动Netty...

    netty小例子

    7. **Handler 的类型**: 包括 `InboundHandler` 和 `OutboundHandler`。前者处理入站事件(如接收到的数据),后者处理出站事件(如写出的数据)。 8. **Handler 的生命周期方法**: 如 `channelActive()`, `...

    netty-demo.zip

    6. **ChannelHandler**:处理网络事件和数据的接口,包括InboundHandler(处理入站事件)和OutboundHandler(处理出站事件)。 学习Netty示例代码: 在"netty-demo"这个示例代码中,我们可以看到以下几个关键部分:...

    netty全文指南-高清

    ChannelHandler 是 Netty 中处理事件的核心接口,分为两种类型:InboundHandler(入站操作,如接收数据、连接建立等)和 OutboundHandler(出站操作,如发送数据、关闭连接等)。通过组合不同的 Handler,可以实现...

    《netty实战》书籍里的入门小案例代码实践,以及后续可能继续添加一些工作中的案例.zip

    - **InboundHandler**:处理入站事件,如连接建立、数据读取等。 - **OutboundHandler**:处理出站事件,如写数据、关闭连接等。 - 用户可以通过自定义 ChannelHandler 来实现特定的业务逻辑。 4. **ByteBuf** ...

    netty4-demos

    4. **Handlers**:ChannelHandler 是 Netty 中处理业务逻辑的基本组件,分为 InboundHandler(处理入站事件,如接收数据)和 OutboundHandler(处理出站事件,如发送数据)。开发者可以根据需求自定义 ...

    基于Java NIO的网络服务器Netty生产实例.zip

    4. **Netty的ChannelHandler**:ChannelHandler是处理网络事件的核心接口,分为InboundHandler(入站处理器)和OutboundHandler(出站处理器),分别处理接收的数据和发送的数据。你可以自定义处理器来实现业务逻辑...

Global site tag (gtag.js) - Google Analytics