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网络通信框架学习之源码分析的更多相关文章

  1. DotNetty网络通信框架学习之初识Netty

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  2. DotNetty网络通信框架学习

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  3. 深入理解分布式调度框架TBSchedule及源码分析

    简介 由于最近工作比较忙,前前后后花了两个月的时间把TBSchedule的源码翻了个底朝天.关于TBSchedule的使用,网上也有很多参考资料,这里不做过多的阐述.本文着重介绍TBSchedule的 ...

  4. $Django cbv源码分析 djangorestframework框架之APIView源码分析

    1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...

  5. 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)

    1 智能生活项目需求 看一个具体的需求 1) 我们买了一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作. 2) 这些智能家电来自不同的厂家,我们不想针 ...

  6. 设计模式(二十一)——解释器模式(Spring 框架中SpelExpressionParser源码分析)

    1 四则运算问题 通过解释器模式来实现四则运算,如计算 a+b-c 的值,具体要求 1) 先输入表达式的形式,比如 a+b+c-d+e,  要求表达式的字母不能重复 2) 在分别输入 a ,b, c, ...

  7. bootstrap-modal 学习笔记 源码分析

    Bootstrap是Twitter推出的一个开源的用于前端开发的工具包,怎么用直接官网 http://twitter.github.io/bootstrap/ 我博客的定位就是把这些年看过的源码给慢慢 ...

  8. ⑤NuPlayer播放框架之GenericSource源码分析

    [时间:2017-01] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,GenericSource] 0 导读 GenericSource是NuPlayer:: ...

  9. ④NuPlayer播放框架之Renderer源码分析

    [时间:2016-11] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,渲染器,render] 0 导读 之前我们分析了NuPlayer的实现代码,本文将重点聚 ...

随机推荐

  1. arcgis中转换netCDF为栅格数据

    最近有个同学询问我一个问题,使用arcpy把netcdf转化成栅格文件,忙活了两个小时才搞定,其实主要代码非常简单,只不过要对arcgis 的功能比较熟悉(其实多思考和查考它的帮助文章,无聊) # - ...

  2. vue中Prop父子传值方法

    在用vue做项目的过程中感觉很好玩,特做下笔记... 父组件中: <template> <div> <fpdx-modal :zbArr="polygonArr ...

  3. UIButton设置标题左对齐

    Button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;//左对齐(UIControlContentHo ...

  4. __x__(38)0909第五天__雪碧图的制作

    1. 用ps打开目标图片若干. 2. 调整合适的画布大小. 3. 将图片拖曳到一张里. 4. 存储为Web所用格式,选择 png24 .

  5. jQuery (02) 重点知识点总结

    jQuery 如果用户未登录,当加入购物车,会将商品相关信息存入 cookie 或者 session,这两个都是可以标识用户信息的东西 是一个 JavaScript 库,封装了常用的开发功能,和一些需 ...

  6. Jenkins-权限管理

    一.要对用户进行管理首先下载一个权限管理插件(系统管理>>>插件管理) Role-based Authorization Strategy 系统管理   >>>全局 ...

  7. window10, java环境配置完后在cmd,输入java成功了,但为什么输入javac就失败了

    一.Path的配置:按一般的网上教程,配置时都会是复制这段[%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;] win10的都分开显示,还是比较直观,但由于编辑器的原因,所有变 ...

  8. MySQL8.0.15的安装与配置---win10

    1.下载地址 https://dev.mysql.com/downloads/installer/ 安装文件:mysql-installer-community-8.0.15.0.msi 2.安装 默 ...

  9. appium api笔记

    打印上下文driver.contexts打印当前上下文driver.contextdriver.current_context切换上下文driver.switch_to.context('WEBVIE ...

  10. [Day23]IO(字节流、字符流)

    1.字节流 1.1 字节输出流OutputStream-抽象类,表示输出字节流的所有类的超类 (1)void close() 关闭此输出流并释放与此流相关的所有系统资源 (2)void flush() ...