DotNetty 学习
【转载】http://www.cnblogs.com/littlegod/p/7699482.html
DotNetty的学习是带着如下这些问题展开:
1. Socket基础框架方案:
通信模式:异步非阻塞
DotNetty采用 ServerBootstrap对象引导Socket服务器启动,通过设置工作组线程(group),设置通道模式(Channel<TcpServerSocketChannel>),设置网络参数(Option),设置主线程处理程序(Handler),设置子线程处理程序(ChildHandler)等来完成。
每一个创建的socket对象被映射成IChannel对象,其管理则是通过 IChannelPipeline管道来统一处理其生命周期,管道通过AddLast 方法注册各类 Handler处理程序, 这些Handler处理程序被划分为 消息入站和消息出站两种类型,为完成需要的功能,需要重写框架设计好的事件处理方法, 常用的包括 IChannel的注册,激活,读取,写入,释放等等。
2.粘包拆包的实现
DotNetty对通信的粘包拆包是由消息入站和消息出战的Handler处理程序, 入站的Handler 解析传入消息的包头,包长度等,出站则要对消息添加包头和长度等信息,这两个Handler处理程序分别是:LengthFieldPrepender ,LengthFieldBasedFrameDecoder
3.心跳包实现
管道中加入IdleStateHandler来处理超时时间,消息处理Handler则需要重写 userEventTriggered 处理超时。
4. Channel管道机制解决代码复用问题
消息可以从任何Handler点发起,如果没有明确具体的Handler,则整个管道都会走一遍,比如 通过context执行写入,那么消息则会被从当前Handler处传递到下一个Handler; 如果使用IChannel对象来写入,则不确定是在哪个Handler上,消息则会在整个管道走一遍。
5. IChannel对象和Context对象复用问题
context对象包含了对Ichannel对象的引用, Ichannel对象通过获取当前管道对象可以获取当前context对象。 二者都可以缓存并后续使用。
6.DotNetty对KeepAlive的处理
在引导程序的设置中,可以设置ChannelOption,开启KeepAlive, 但是框架也仅仅实在这一层面做了处理,如果想要对keepalive的空闲时间等更精细化设置,框架还不支持,从这点上应该看出DotNetty不推荐使用KeepAlive来维持连接。
--------------------------------------------------------------------------------------------------
1:关于Channel:
SocketDatagramChannel:针对UDP的管道实现
TcpServerSocketChannel:针对TCP服务端的管道实现
TcpSocketChannel:针对TCP客户端的管道实现
2:关于编解码器:
Echo.Server中关于编码和解码器的代码如下:

bootstrap
.Option(ChannelOption.SoBacklog, 10000)
.Handler(new LoggingHandler("SRV-LSTN"))
.ChildHandler(new ActionChannelInitializer<IChannel>(channel =>
{
IChannelPipeline pipeline = channel.Pipeline;
if (tlsCertificate != null)
{
pipeline.AddLast("tls", TlsHandler.Server(tlsCertificate));
}
pipeline.AddLast(new LoggingHandler("SRV-CONN"));
pipeline.AddLast("编码器", new LengthFieldPrepender(2));
pipeline.AddLast("解码器", new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2)); pipeline.AddLast("echo", new EchoServerHandler());
}));

LengthFieldPrepender为什么是编码器,LengthFieldBasedFrameDecoder为什么是解码器,我们来看相关的代码实现:
public class LengthFieldPrepender : MessageToMessageEncoder<IByteBuffer>
public class LengthFieldBasedFrameDecoder : ByteToMessageDecoder
也就是说,LengthFieldPrepender类就是对应了编码操作,而LengthFieldBasedFrameDecoder类就是对应了解码操作。
DotNetty 学习的更多相关文章
- [转载]DotNetty 学习
[转载]http://www.cnblogs.com/littlegod/p/7699482.html DotNetty的学习是带着如下这些问题展开: 1. Socket基础框架方案: 通信模式:异步 ...
- DotNetty学习笔记
DotNetty项目本身的示例很容易运行起来,但是具体到真实的应用场景,还是需要进一步理解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 ...
- DotNetty网络通信框架学习之源码分析
DotNetty网络通信框架学习之源码分析 有关DotNetty框架,网上的详细资料不是很多,有不多的几个博友做了简单的介绍,也没有做深入的探究,我也根据源码中提供的demo做一下记录,方便后期查阅. ...
- .NET Core微服务学习-DotNetty
DotNetty介绍: DotNetty是Azure团队仿照(几乎可以这么说)JAVA的Netty而出来的(目前已实现Netty的一部分),目前在Github上的Star有1.8K+, 地址:http ...
- 使用DotNetty编写跨平台网络通信程序
长久以来,.Net开发人员都非常羡慕Java有Netty这样,高效,稳定又易用的网络通信基础框架.终于微软的Azure团队,使用C#实现的Netty的版本发布.不但使用了C#和.Net平台的技术特点, ...
- 通信传输利器Netty(Net is DotNetty)介绍
(先埋怨一下微软大大)我们做NET开发,十分羡慕JAVA上能有NETTY, SPRING, STRUTS, DUBBO等等优秀框架,而我们NET就只有干瞪眼,哎,无赖之前生态圈没做好,恨铁不成钢啊.不 ...
- 开源 DotNetty 实现的 Modbus TCP/IP 协议
本项目的目的是为了学习 DotNetty 与 Modbus 协议,参考 modjn 实现功能 0x01: Read Coils (读取线圈/离散量输出状态) 0x02: Read Discrete I ...
随机推荐
- C# wpf 阻止*和|的输入
private void texBox_KeyDown(object sender, KeyEventArgs e) { if (Keyboard.Modifiers == ModifierKeys. ...
- Codeforces 671A Recycling Bottles(贪心+思维)
题目链接:http://codeforces.com/problemset/problem/671/A 题目大意:给你两个人的位置和一个箱子的位置,然后给出n个瓶子的位置,要求让至少一个人去捡瓶子放到 ...
- CentOS 7命令行安装图形界面(GNOME、KDE等)
CentOS 7 默认是没有图形化界面的,但我们很多人在习惯了 Windows 的图形化界面之后,总是希望有一个图形化界面从而方便我们使用,这里介绍一下 CentOS7安装图形化桌面系统的方法. 一. ...
- django中注册功能signup的测试例
这个是套路, 有了这些测试用例, 开发就会更有保障, 且每次重写,都好麻烦, 不好cp来得快~~:) from django.test import TestCase from django.urls ...
- Codeforces 623B Array GCD
Array GCD 最后的序列里肯定有a[1], a[1]-1, a[1]+1, a[n], a[n]-1, a[n]+1中的一个,枚举质因子, dp去check #include<bits/s ...
- 006.FTP用户访问控制配置
一 FTP控制文件 1.1 文件说明 /etc/vsftpd/ftpusers:黑名单,优先级高 #通常不修改此文件 /etc/vsftpd/user_list:黑名单,优先级相对低 注意:Linux ...
- 利用Windows7自带的截图工具获取菜单截图的步骤
打开截图工具后,按 Esc,然后打开要捕获的菜单. 按 Ctrl+PrtScn. 单击“新建”按钮旁边的箭头,从列表中选择“任意格式截图”.“矩形截图”.“窗口截图”或“全屏幕截图”,然后选择要捕获的 ...
- Bootstrap css-表格
前言:整理的东西比较基础,有不足的地方欢迎大家批评指正! 1,Bootstrap基本的表格结构 源代码: <table class="table"> <cap ...
- react比较入门的小demo
什么是jsx? JSX是JavaScript XML 这两个单词的缩写,xml和html非常类似,简单来说可以把它理解成使用各种各样的标签,大家可以自行 百度.所以jsx就是在javascri ...
- BZOJ.1061.[NOI2008]志愿者招募(线性规划 对偶原理 单纯形 / 费用流SPFA)
题目链接 线性规划 用\(A_{ij}=0/1\)表示第\(i\)天\(j\)类志愿者能否被招募,\(x_i\)为\(i\)类志愿者招募了多少人,\(need_i\)表示第\(i\)天需要多少人,\( ...