Netty-2-服务端创建多个handler

首先,应该先了解ChannelHandlerContext类中的一些方法,对于服务端来说,我们只关注以fire开头的方法,fire表示inbound事件,当调用fireXXX方法的时候,表示触发下一个handler中的XXX事件,这点很重要,没错,就是自己手动调用
注意:是ChannelHandlerContext.fireXXX方法,而不是ChannelHandlerContext.pipeline().fireXXX方法

创建多个handler的方式有很多,最标准的做法是这样的,你需要创建个继承ChannelInitializer的类,当然,这个ChannelInitializer其实也是一个handler,下面是一个演示我自己创建了三个handler的示例

public class MyServerHandler0 extends ChannelInitializer<Channel> {
	@Override
	protected void initChannel(Channel ch) throws Exception {
		ch.pipeline().addLast(new MyServerHandler1());
		ch.pipeline().addLast(new MyServerHandler2());
		ch.pipeline().addLast(new MyServerHandler3());
	}
}

当然,也可以不用ChannelInitializer,直接在MyServerHandler1里的handlerAdded方法中加入其它的handler,比如这样

	@Override
	public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
		ctx.pipeline().addLast(new MyServerHandler2());
		ctx.pipeline().addLast(new MyServerHandler3());
	}

handler添加完毕之后,当触发第一个handler的事件之后,并不是自动触发第二个handler的相同事件,而是需要手动指定事件,比如下面的代码,演示了触发第一个handler的read事件之后,再触发下一个handler的active事件

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		System.out.println("触发了读事件");
		ctx.fireChannelActive();
	}

其中context中,方法以fire开头的都是inbound事件,也就是输入事件
综上所述,下面是一个服务器端接收到一个字节的时候,触发三个handler的完整事例,触发三个handler+一个配置handler=四个handler,其中MyServerHandler0已经在上述例子中,下面是另外三个

public class MyServerHandler1 implements ChannelInboundHandler {
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		System.out.println("MyServerHandler1");
		ctx.fireChannelRead(msg);
	}
	//省略其他Override方法
}
public class MyServerHandler2 implements ChannelInboundHandler {
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		System.out.println("MyServerHandler2");
		ctx.fireChannelRead(msg);
	}
	//省略其他Override方法
public class MyServerHandler3 implements ChannelInboundHandler {
	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		System.out.println("MyServerHandler3");
		ctx.fireChannelRead(msg);
	}
	//省略其他Override方法

main方法

public static void main(String[] args) throws InterruptedException {
		EventLoopGroup boosGroup = new NioEventLoopGroup();
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		ServerBootstrap b = new ServerBootstrap();
		b.group(boosGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new MyServerHandler0());
		ChannelFuture f = b.bind(9999).sync();
		f.channel().closeFuture().sync();
	}

使用telnet向端口9999发送数据,控制台打印

MyServerHandler1
MyServerHandler2
MyServerHandler3
发布了157 篇原创文章 · 获赞 26 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/u011624903/article/details/103079324
今日推荐