在上一篇文章讲到Dotnetty的基本认识,本文这次会讲解dotnetty非常核心的模块是属于比较硬核的干货了,然后继续往下讲解如何根据自己的需求或者自己的喜好去配置Dotnetty而不是生搬硬套官网的示例源码。如果看了本文有收获的话麻烦关注一下文章尾部的公众号和技术讨论群。各位的支持是对我莫大的帮助。
主要讲解一下几个知识点:
Dotnetty源码:
Group :设置线程组模型,Reactor线程模型对比EventLoopGroup
单线程
多线程
主从线程
Channel:设置channel通道类型NioServerSocketChannel、OioServerSocketChannel
Option: 作用于每个新建立的channel,设置TCP连接中的一些参数,如下:
ChannelOption.SO_BACKLOG: 存放已完成三次握手的请求的等待队列的最大长度;
ChannelOption.TCP_NODELAY: 为了解决Nagle的算法问题,默认是false, 要求高实时性,有数据时马上发送,就将该选项设置为true关闭Nagle算法;如果要减少发送次数,就设置为false,会累积一定大小后再发送。
ChildOption: 作用于被accept之后的连接
ChildHandler: 用于对每个通道里面的数据处理
Channel: 客户端和服务端建立的一个连接通道(可以理解为一个channel就是一个socket连接) ChannelHandler: 负责Channel的逻辑处理 ChannelPipeline: 负责管理ChannelHandler的有序容器
关系: 一个Channel包含一个ChannelPipeline,所有ChannelHandler都会顺序加入到ChannelPipeline中 创建 Channel时会自动创建一个ChannelPipeline,每个Channel都有一个管理它的pipeline,这关联是永久 性的Channel当状态出现变化,就会触发对应的事件。
生命周期:
ChannelRegistered: channel注册到一个EventLoop
ChannelActive: 变为活跃状态(连接到了远程主机),可以接受和发送数据
ChannelInactive: channel处于非活跃状态,没有连接到远程主机
ChannelUnregistered: channel已经创建,但是未注册到一个EventLoop里面,也就是没有和Selector绑定
ChannelInboundHandler:(入站) 处理输入数据和Channel状态类型改变,适配器。
ChannelInboundHandlerAdapter(适配器设计模式) 常用的:SimpleChannelInboundHandler
ChannelOutboundHandler:(出站) 处理输出数据,适配器 ChannelOutboundHandlerAdapter
ChannelPipeline: 好比厂里的流水线一样,可以在上面添加多个ChannelHanler,也可看成是一串
ChannelHandler 实例,拦截穿过 Channel 的输入输出 event, ChannelPipeline 实现了拦截器的一种高级形式,使得用户可以对事件的处理以及ChannelHanler之间交互获得完全的控制权。
ChannelHandlerContext是连接ChannelHandler和ChannelPipeline的桥梁,ChannelHandlerContext部分方法和Channel及ChannelPipeline重合。
一般的项目中,inboundHandler和outboundHandler有多个,在Pipeline中的执行顺序?
InboundHandler顺序执行,OutboundHandler逆序执行
希望大家多多支持。不胜感激。
原文:https://www.cnblogs.com/justzhuzhu/p/12941291.html