一个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); } }
相关推荐
- ChannelHandler:处理网络事件和I/O操作的接口,分为InboundHandler和OutboundHandler。 - 事件循环(EventLoop):每个Channel都关联一个事件循环,负责调度和执行事件处理任务。 - 事件生命周期:连接建立、...
有InboundHandler和OutboundHandler之分,分别处理接收和发送的数据。 7. **pom.xml 文件** 在Java项目中,pom.xml是Maven项目的配置文件,用于管理依赖关系。在Netty demo中,它会包含Netty库和其他可能的依赖库...
1. **ChannelHandler**:处理网络事件的核心接口,分为InboundHandler和OutboundHandler。 2. **ByteBuf**:Netty的缓冲区实现,比Java NIO的ByteBuffer更加强大和灵活。 3. **Pipeline**:每个Channel都有一个...
- **ChannelHandler**: ChannelHandler是处理I/O事件的核心组件,分为InboundHandler和OutboundHandler,分别处理输入和输出事件。 - **BossGroup和WorkerGroup**: Netty中的线程组,BossGroup负责接收新的连接,...
5. **ChannelHandler**:ChannelHandler是用于处理特定类型事件的接口,可以实现InboundHandler或者OutboundHandler接口来处理入站或出站事件。 ### 关键技术点详解 #### 1. Bootstrap配置 Bootstrap是启动Netty...
7. **Handler 的类型**: 包括 `InboundHandler` 和 `OutboundHandler`。前者处理入站事件(如接收到的数据),后者处理出站事件(如写出的数据)。 8. **Handler 的生命周期方法**: 如 `channelActive()`, `...
6. **ChannelHandler**:处理网络事件和数据的接口,包括InboundHandler(处理入站事件)和OutboundHandler(处理出站事件)。 学习Netty示例代码: 在"netty-demo"这个示例代码中,我们可以看到以下几个关键部分:...
ChannelHandler 是 Netty 中处理事件的核心接口,分为两种类型:InboundHandler(入站操作,如接收数据、连接建立等)和 OutboundHandler(出站操作,如发送数据、关闭连接等)。通过组合不同的 Handler,可以实现...
- **InboundHandler**:处理入站事件,如连接建立、数据读取等。 - **OutboundHandler**:处理出站事件,如写数据、关闭连接等。 - 用户可以通过自定义 ChannelHandler 来实现特定的业务逻辑。 4. **ByteBuf** ...
4. **Handlers**:ChannelHandler 是 Netty 中处理业务逻辑的基本组件,分为 InboundHandler(处理入站事件,如接收数据)和 OutboundHandler(处理出站事件,如发送数据)。开发者可以根据需求自定义 ...
4. **Netty的ChannelHandler**:ChannelHandler是处理网络事件的核心接口,分为InboundHandler(入站处理器)和OutboundHandler(出站处理器),分别处理接收的数据和发送的数据。你可以自定义处理器来实现业务逻辑...