Netty 重构 客户端与服务端 Pipeline

17 篇文章 0 订阅
17 篇文章 4 订阅

拍摄于西安大兴善寺。

                                                                             微信公众号

                                                         王皓的GitHub:https://github.com/TenaciousDWang

 

        昨天我们学习了Netty的Pipeline与ChannelHandler组件,并且认识了他们的关系与结构。在上一节我们分析过目前代码存在重复实用,以及逻辑臃肿,无法解耦等问题,今天我们来学习几个Netty为我们准备的实用的Handler来重构我们的代码。

 

        我们看一下逻辑处理器中,编码与解码的代码一直在重复使用,任何场景都需要使用,是代码不够优雅,不过好在Netty贴心的为我们提供了一对现成的Handler用来专门处理解码与编码问题,同时我们在昨天的文章中提过关于逻辑臃肿不断使用if与else,同时无法解耦,Netty也提供了一个Handler来帮我们解决这个问题,下面我们按照顺序解码-逻辑处理-编码来讲一下这三个非常实用的Handler。

 

        第一个,解码是将二进制数据包通过我们之前编写的解码方法转化为一个Java对象,来进行后面的逻辑处理MessageToMessageDecoder。

 

 

            这里我们创建一个PacketDecoder类,继承ByteToMessageDecoder<ByteBuf>类,我们只需要覆写decode方法即可,这里我们可以看到这个逻辑处理器的decode方法传入的一个ChannelHandlerContext,我们可以通过它拿到上下文信息,一个in变量,它的类型直接为ByteBuf,我们不需要强转直接可以拿来使用,out则为我们需要传递给下一个逻辑处理器的数据,就是我们使用PacketCodeC解码后给out这个list添加数据即可,这里为了效率,我们提前先将PacketCodeC变为单例模式。

 

        接下来我们来改造一下登陆与消息收发逻辑处理器,这里我们使用Netty为我们准备的SimpleChannelInboundHandler类,在后面传递一个泛型参数后,可替代if与else来判断当前数据包类型,并实现解耦,不同的数据类型交给不同的Handler来处理。

 

 

        首先看一下客户端关于登陆及登陆响应,当服务端发来的数据包类型为LoginResponsePacket时,进入该逻辑处理器,并调用channelRead0方法,入参除了ctx,还有一个数据包类型,与指定泛型一致,由于我们前面进行了统一的decode,所以这边数据包无需强转,可以直接处理,代码简洁且优雅。大家可能会问问什么channelActive方法里loginRequestPacket数据包不需要编码,可以直接写入,下面我们继续来说一下MessageToByteEncoder类。

 

 

        我们将这个类放置在逻辑链最后端,就可以实现统一编码,至此我们将臃肿的if与else业务逻辑与反复编码与解码的代码全部抽取出来,使得现在的代码非常简洁,我们再看一下客户端代码,思路也非常清晰,这样我们就重构了客户端与服务端的Pipeline,优化了代码结构,并使各个业务逻辑解耦,代码思路更加清晰。

 

 

 

        解码,逻辑处理,编码,全部解耦,结构更加清晰。服务端代码的重构类似,这里就不再赘述了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值