Netty专栏 ( 八 )——— ChannelHandler动态添加-动态编排案例分享
程序员文章站
2024-03-11 22:45:49
...
Netty-Small-Demo
@author 鲁伟林
子项目Netty-Small-Demo介绍诸多使用Netty的小案例。如: ChannelHandler动态编排、AttributeMap的使用或ChannelPrimise等诸多Netty提供的特性。
非常欢迎同学们fork或者留言,一起交流技术。
本博客中涉及的完整代码:
GitHub地址: https://github.com/thinkingfioa/netty-learning/tree/master/netty-small-demo。
本人博客地址: https://blog.csdn.net/thinking_fioa
项目的案例介绍
Netty-Samll-Demo子项目,基于Netty的多个特性,实现多种案例。介绍如下:
索引 | 案例 | 作用 |
---|---|---|
1 | UDP传输 | 实现Netty的UDP传输机制 |
2 | ChannelHandler动态编排 | 根据实际业务场景,动态编排ChannelHandler |
3 | AttributeMap使用 | 利用ChannelAttributeMap,实现多个ChannelHandler传递变量 |
4 | Netty与多种编码器的使用 | 基于Netty和多种编码节技术,实现自定义协议开发 |
5 | ChannelGroup使用 | Netty的ChannelGroup管理Channel |
6 | channel.writeAndFlush与ctx.writeAndFlush区别 | 案例分析两者不同点 |
2. ChannelHandler动态编排
Netty提供用户事件触发: userEventTriggered特性,实现ChannelHandler动态编排。案例代码Package: package org.lwl.netty.dynamic。如果想阅读源码,建议下载源码,导入idea中阅读。阅读过程中,欢迎交流
- 项目源码: 地址
- 项目包名: org.lwl.netty.dynamic
- 项目Main类: DynamicDemoStart
2.1 场景
实际项目开发中,客户端存在这样两个问题:
- 创建Channel对象时,无法明确的知道需要添加到ChannelPipeline链上的具体ChannelHandler有哪些?具体ChannelHandler往往是运行时才能知道。
- 一次性将所有的ChannelHandler添加到ChannelPipeline链上往往与设计不符。比如:用户先完成认证延签后,采用发起用户登录。用户完成登录,才能发起消息类型订阅。
2.2 项目介绍
ChannelHandler动态编排项目,主要讲解了如何通过userEventTriggered特性,来实现动态向ChannelPipeline加入ChannelHandler。项目主要模拟https单向认证的过程,Server端一次性添加所有的ChannelHandler到ChannelPipeline上,Client端分下列步骤加入ChannelHandler
- 发送Client端SSL版本等信息。 ----- SslHandler
- 发送Client端支持的对称加密方案。 ----- SymEncryptionHandler
- 产生随机码作为对称加***,使用服务端的公钥对随机码加密,发送给服务端。 ----- RandomCodeHandler
- 发送加密后登录消息消息。 ----- LoginHandler
- 登录成功后加入心跳Handler ----- HeartbeatClientHandler
2.3 https单向认证序列图
2.4 客户端ChannelHandler介绍
- ClientInitHandler ----- 客户端初始Handler,向Pipeline添加SslHandler
- SslHandler ----- 发送SSL版本信息。收到服务端回复后,向Pipeline添加SymEncryptionHandler
- SymEncryptionHandler ----- 发送对称加密方案。收到服务端回复后,向Pipeline添加RandomCodeHandler
- RandomCodeHandler ----- 发送随机码。同时向Pipeline添加LoginHandler
- LoginHandler ----- 发送登录请求。收到登录响应后,向Pipeline添加HeartbeatClientHandler
- HeartbeatClientHandler ----- tcp心跳读写事件处理
- DynamicTriggerHandler ----- 处理用户自定义添加ChannelHandler事件请求
2.5 项目讲解
- ChannelHandler动态编排中使用较为简单的编解码器,如果想深入学习Netty多种编解码方式,请看netty-private-protocol子项目。
- 消息采用简单的消息格式。项目主要想表明如果实现ChannelHandler动态编排机制,https单项认证部分只是一个简单的框架,点到为止。
- 项目使用Netty提供的LengthFieldBasedFrameDecoder来解决粘包粘包问题,每条消息头部添加4个字节的长度字段。可参考博客来配置粘包粘包参数
- 项目的编解码使用较为简单的编解码,如果想了解多种netty编解码使用,可以参考博客待补充
- 项目启动类: DynamicDemoStart.java
2.6 运行结果图
无,终端输出可见
参考:
上一篇: Java 方法签名详解及实例代码