DotNetty网络通信框架学习之源码分析
DotNetty网络通信框架学习之源码分析
有关DotNetty框架,网上的详细资料不是很多,有不多的几个博友做了简单的介绍,也没有做深入的探究,我也根据源码中提供的demo做一下记录,方便后期查阅。
github地址:https://github.com/Azure/DotNetty

源码的src文件夹中是框架的dll项目,包含以下的内容:

1、DotNetty.Buffers
缓冲区:传输数据时一般都会使用一个缓冲区包装数据,DotNetty衍生于Java的Netty,定义了自己的Buffer。Netty的提供的Buffer相当的强大,用来表示一个字节序列,帮助开发者定义自己的buffer类型。详细的介绍参考:https://blog.csdn.net/wangjinnan16/article/details/77972113.
buffers中还提供了很多类和接口,其中ByteBufferUtil.cs是一个Bytebuffer的帮助类,可将接收的缓冲区包转换成需要的数据格式,其中我用到的是:Hexdump,是将buffer转换成十六进制的字符串,方便在Modbus解析中使用。
2、DotNetty.Codecs
编解码器:编解码器的作用就将原始字节数据与目标程序数据格式之间进行相互转换。网络中的数据是字节的数据形式进行传输的,通过编码和解码来满足对数据的利用。Netty中根据不同数据传输类型,扩展了很多的解码规则抽象类。其中包括项目中的Http、Mqtt、Protobuf、Redis等。工作机制大概如下:

Decodes.Http
http协议实现的抽象类,类型如下:

HttpMethod:对method的封装,包含method序列化的操作。get,put,post等。
HttpVersion:对Version的封装,包含版本1.0与1.1
HttpHeaders:包含对header的内容进行的封装及操作。
HttpContent:对httpnbody的封装,其本质是一个bytebuffer,
HttpRequest:包含对Request Line和Header的组合。
FullHttpRequest:包含对HttpRequest和httpContent 的组合封装。
request流程处理
基本的处理原理:

使用方法:只需要在通道ChannelLine中配置HttpRequestDecoder和HttpObjectAggregator.
HttpRequest解码器现将强求通道中的内筒解析成HttpRequest对象,在传到聚合其中,当聚合器解析完http协议后,再封装成FullHttpRequest。
response流程处理
原理:

使用方法在编码之前加上HttpContent压缩机,response先被压缩后再进行编码序列化。压缩只是对Body的压缩。
有关Http编解码器的详细内容可参考:https://www.cnblogs.com/chris-oil/p/6098258.html
Codecs.Mqtt协议编解码
首先了解一下MQTT协议:根据百度百科的解释,它的的定义如下:
Mqtt(Message Queuing Telemetry Transport) 消息队列遥测传输,是IBM开发的一个即时通讯协议。该协议支持所有的平台,被广泛用于人工智能,区块链和物联网等。

MQTT提供了订阅和发布两种消息模式,更为简约、轻量、易于使用,特别适用于受限环境中的消息发布,属于物联网的一个标准传输协议。
更过的关于MQTT的内容学习可参考:http://www.360doc.com/content/18/0116/05/163747_722273693.shtml
Netty中提供了MQTT协议的解码和编码方法,具体的实践探索将在后期进行。
Codecs.Protobuf 协议编解码器
同样先得知道Protobuf协议是个什么东西:
Protobuf(Google Protocol Buffer):是谷歌开发的一套用于数据存储,网络通信时用于协议编解码的工具库,和XML和JSON类似,把数据用某种形式保存起来,唯一不同的是它是一种二进制的数据格式,具有更好的传输,打包和解包的效率。
DotNetty只是提供了编辑码协议用的抽象类,并没有做进一步的处理,有关协议的详细使用后期将不断的探索。更多内容可参考大神博客:https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html ,http://baijiahao.baidu.com/s?id=1583577904006702816&wfr=spider&for=pc。
有关ProtocolBuf协议的解析过程探索可参考:https://www.cnblogs.com/Binhua-Liu/p/5577622.html
https://blog.csdn.net/kokjuis/article/details/72845163
https://blog.csdn.net/z69183787/article/details/52980720
Codecs.Redis 协议协议编解码器
下面是一段对Redis中协议的介绍:
Redis的客户端与服务端采用一种叫做 RESP(REdis Serialization Protocol)的网络通信协议交换数据。RESP的设计权衡了实现简单、解析快速、人类可读这三个因素。Redis客户端通过RESP序列化整数、字符串、数据等数据类型,发送字符串数组表示参数的命令到服务端。服务端根据不同的请求命令响应不同的数据类型。除了管道和订阅外,Redis客户端和服务端都是以这种简单的请求-响应模型通信的。 --------------------- 本文来自 cdai 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/dc_726/article/details/46565257?utm_source=copy
以”*”消息头标识总长度,消息内部还可能有”$”标识字符串长度,每行以\r\n结束
- 简单字符串(Simple String):以”+”开头,表示正确的状态信息,”+”后就是具体信息。许多Redis命令使用简单字符串作为成功的响应,例如”+OK\r\n”。但简单字符串因为不像Bulk String那样有长度信息,而只能靠\r\n确定是否结束,所以 Simple String不是二进制安全的,即字符串里不能包含\r\n。
- 错误(Error):以”-“开头,表示错误的状态信息,”-“后就是具体信息。
- 整数(Integer):以”:”开头,像SETNX, DEL, EXISTS, INCR, INCRBY, DECR, DECRBY, DBSIZE, LASTSAVE, RENAMENX, MOVE, LLEN, SADD, SREM, SISMEMBER, SCARD都返回整数。
- 批量字符串(Bulk String):以”$”开头,表示下一行的字符串长度,具体字符串在下一行中,字符串最大能达到512MB。”$-1\r\n”叫做Null Bulk String,表示没有数据存在。
- 数组(Array):以”*”开头,表示消息体总共有多少行(不包括当前行),”*”是具体行数。客户端用RESP数组表示命令发送到服务端,反过来服务端也可以用RESP数组返回数据的集合给客户端。数组可以是混合数据类型,例如一个整数加一个字符串”*2\r\n:1\r\n$6\r\nfoobar\r\n”。另外,嵌套数组也是可以的。
Netty中提供的几个与Redis有关的Handler为:
- RedisCommandDecoder:解析Redis协议,将字节数组转为Command对象。
- RedisReplyEncoder:将响应写入到输出流中,返回给客户端。
- RedisCommandHandler:执行Command中的命令。
详细的有关redis协议的处理将在后期更新,相关内容参考至:https://blog.csdn.net/dc_726/article/details/46565257
Handler、Transport、TransportLibuv
这是Netty中核心的东西,包含所有的数据转换和处理的内容,将在后期的学习中不断的完善。
以上内容是参考了很多网上的资源,感谢那些原创作者的贡献,仅作为个人学习使用。
DotNetty网络通信框架学习之源码分析的更多相关文章
- DotNetty网络通信框架学习之初识Netty
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- DotNetty网络通信框架学习
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- 深入理解分布式调度框架TBSchedule及源码分析
简介 由于最近工作比较忙,前前后后花了两个月的时间把TBSchedule的源码翻了个底朝天.关于TBSchedule的使用,网上也有很多参考资料,这里不做过多的阐述.本文着重介绍TBSchedule的 ...
- $Django cbv源码分析 djangorestframework框架之APIView源码分析
1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...
- 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)
1 智能生活项目需求 看一个具体的需求 1) 我们买了一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作. 2) 这些智能家电来自不同的厂家,我们不想针 ...
- 设计模式(二十一)——解释器模式(Spring 框架中SpelExpressionParser源码分析)
1 四则运算问题 通过解释器模式来实现四则运算,如计算 a+b-c 的值,具体要求 1) 先输入表达式的形式,比如 a+b+c-d+e, 要求表达式的字母不能重复 2) 在分别输入 a ,b, c, ...
- bootstrap-modal 学习笔记 源码分析
Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,怎么用直接官网 http://twitter.github.io/bootstrap/ 我博客的定位就是把这些年看过的源码给慢慢 ...
- ⑤NuPlayer播放框架之GenericSource源码分析
[时间:2017-01] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,GenericSource] 0 导读 GenericSource是NuPlayer:: ...
- ④NuPlayer播放框架之Renderer源码分析
[时间:2016-11] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,渲染器,render] 0 导读 之前我们分析了NuPlayer的实现代码,本文将重点聚 ...
随机推荐
- MVC:添加Html辅助器
本文的方法来自 <精通asp.net Mvc5>. 一.添加视图模型 为了支持Html辅助器方法,可以把可用页面数,当前面,以及存储库中产品数等信息传递给视图.在Model文件夹内增加一个 ...
- 搜素题 --java
Poj2531 首先把所有节点都放在一组,然后采用深度优先搜索的方法,对每一个节点都做判断是否应该移到另一组去,判断的依据是移过去和不移过去哪个得到的和值比较大(这里移去B组后的计算方法就是加上该点和 ...
- 关于MDN,HTML入门来自MDN文档
由开发者和作者组成的开源社区:推动web发展, MDN(Mozilla Developer Network) 维基,共同维护做贡献: 需要使用到github账号进行验证,以此再创建MDN账号: HTM ...
- django缓存、信号、序列化
本篇导航: Django的缓存机制 Django的信号 Django的序列化 一.Django的缓存机制 1.缓存介绍 1)缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增, ...
- 关于eclipse的Progress一直跳转的解决方案
下载eclipse编程,发现了一个问题:执行main方法第二次console打印不出数据,后发现Progress一直跳转,而且非常多进度条在运行,关闭后第一次执行没问题,第二次问题重复出现. 有幸看到 ...
- 软件体系架构之ssh框架阅读笔记
首先我们要了解一下什么是ssh框架? SSH是 struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架. ssh框架系统从职责上分为四层:web层 业 ...
- tar:short read problem
1. tar:short read problem description 在PC机上将需要下载到板子上的两个文件夹gdb.ncurses用tar命令打包. 命令如下:tar -cvf test5.t ...
- Python: map() and reduce()
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 举例说明,比如我们有一个函数f(x)=x2,要把这个函数作用在一个lis ...
- Codeforces 1154D - Walking Robot - [贪心]
题目链接:https://codeforces.com/contest/1154/problem/D 题解: 贪心思路,没有太阳的时候,优先用可充电电池走,万不得已才用普通电池走.有太阳的时候,如果可 ...
- 一个RDBMS左连接SQL执行计划解析
1.测试数据如下: SQL> select * from t1; a | b | c ---+----+--- 1 | 10 | 1 2 | 20 | 2 3 | 30 | 3 4 ...