1、ctx.writeAndFlush()方法的事件传播路径
ctx.writeAndFlush()方法从Pipeline链中的当前节点开始,往前找到第一个Outbound类型的Handler,把对象往前传播。如果这个对象确认不需要经过其他Outbound类型的Handler处理,那么就使用此方法。
2、ctx.channel().writeAndFlush()方法的事件传播路径
ctx.channel().writeAndFlush()方法从Pipeline链中的最后一个Outbound类型的Handler开始,把对象往前传播。如果你确认当前创建的对象需要经过后面Outbound类型的Handler,那么就调用此方法。
在某个Inbound类型的Handler处理完逻辑之后,调用ctx.channel().writeAndFlush()方法,对象会从最后一个Outbound类型的Handler开始,逐个往前传播,路径要比ctx.writeAndFlush()方法长,如下图所示。
3、服务端代码如下
package com.example.demo.server;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class SInBoundA extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.err.println("Server InBoundA:"+msg);
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.err.println("Server InBoundA channelActive");
super.channelActive(ctx);
}
}
package com.example.demo.server;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class SInBoundB extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.err.println("Server InBoundB:"+msg);
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.err.println("Server InBoundB channelActive");
super.channelActive(ctx);
}
}
package com.example.demo.server;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class SInBoundC extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {