DotNetty 实现 Modbus TCP 系列 (三) Codecs & Handler

 DotNetty 实现 Modbus TCP 系列 (一) 报文类

DotNetty 实现 Modbus TCP 系列 (二) ModbusFunction 类图及继承举例

DotNetty 作为一个半成品,我们不需要关注细节的实现,只需要关注自己的业务即可,所以最主要的就是处理 Codecs 和 Handler。

所有的 Codecs 和 Handler 均直接或间接继承自 ChannelHandlerAdapter。为什么要分为 Codecs 和 Handler,个人理解是 Codecs 负责将消息解码为我们所需的对象或者将处理的结果编码,Handler 对解码得到的对象进行逻辑处理,达到职责分离的目的。

DotNetty 中可以注册多个 Codecs/Handler,入站消息按照注册的先后顺序执行,出站消息按照注册的先后逆序执行。

对于 Client 端:

  • 入站:ModbusDecoder --> ModbusResponseHandler

  • 出站:ModbusEncoder

对于 Server 端:

  • 入站:ModbusDecoder --> ModbusRequestHandler

  • 出站:ModbusEncoder

ModbusDecoder

640?wx_fmt=png

ModbusDecoder 继承了 ByteToMessageDecoder。继承了 ByteToMessageDecoder 的类必须实现的唯一的抽象方法:Decode,该方法将 ByteBuffer 解析为 List,如果 List 不为空则会将该 List 传递给下一个 ChannelHandlerAdapter。

ModbusDecoder 同时为 Client 端和 Server 端使用,如果是 Server 端则将消息解析成请求类,反之如果是 Client 端则将消息解析成响应类。

ModbusResponseHandler

640?wx_fmt=png

将接收到的响应信息加入 responses 供后续处理。

ModbusRequestHandler

640?wx_fmt=png

responseService 为一个抽象类,用来自定义处理接收到的请求并返回结果,需要在实现 Server 端时继承并实现。

640?wx_fmt=png

文中代码仅添加了 0x03 的方法)

ModbusEncoder

640?wx_fmt=png

如果是 ModbusFrame 消息则 Flush,否则传递到下一个 ChannelHandlerAdapter。

开源地址:https://github.com/VictorBu/modbus-tcp

原文地址:https://www.cnblogs.com/victorbu/p/10370890.html

 
 

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值