netty udp高并發,Netty-2-服務端創建多個handler

 2023-10-15 阅读 25 评论 0

摘要:首先,應該先了解ChannelHandlerContext類中的一些方法,對于服務端來說,我們只關注以fire開頭的方法,fire表示inbound事件,當調用fireXXX方法的時候,表示觸發下一個handler中的XXX事件,這點很重要,沒錯,就是自

首先,應該先了解ChannelHandlerContext類中的一些方法,對于服務端來說,我們只關注以fire開頭的方法,fire表示inbound事件,當調用fireXXX方法的時候,表示觸發下一個handler中的XXX事件,這點很重要,沒錯,就是自己手動調用
注意:是ChannelHandlerContext.fireXXX方法,而不是ChannelHandlerContext.pipeline().fireXXX方法

創建多個handler的方式有很多,最標準的做法是這樣的,你需要創建個繼承ChannelInitializer的類,當然,這個ChannelInitializer其實也是一個handler,下面是一個演示我自己創建了三個handler的示例

public class MyServerHandler0 extends ChannelInitializer<Channel> {@Overrideprotected 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,比如這樣

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

netty udp高并發?handler添加完畢之后,當觸發第一個handler的事件之后,并不是自動觸發第二個handler的相同事件,而是需要手動指定事件,比如下面的代碼,演示了觸發第一個handler的read事件之后,再觸發下一個handler的active事件

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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/137058.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息