【转载】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类就是对应了解码操作。

转载于:https://www.cnblogs.com/zeroone/p/8480798.html

DotNetty 学习相关推荐

  1. DotNetty学习—— 总章(索引)

    前一阵子学习了基于.net core的Socket编程.觉得很是有趣.准备深入学习一下Socket编程,听闻Java的Netty框架很是优秀.所以今天来了解一下-DotNetty 这个东西是怎么来的呢 ...

  2. DotNetty网络通信框架学习

    DotNetty网络通信框架学习 目录: 一.DotNetty网络通信框架学习之初视Netty 二.DotNetty网络通信框架学习之源码分析

  3. 使用DotNetty编写跨平台网络通信程序

    长久以来,.Net开发人员都非常羡慕Java有Netty这样,高效,稳定又易用的网络通信基础框架.终于微软的Azure团队,使用C#实现的Netty的版本发布.不但使用了C#和.Net平台的技术特点, ...

  4. 高性能 DotNetty Server Clinet Demo .NetCore

    Nuget 引用 client 端 Install-Package DotNetty.Codecs -Version 0.6.0 Install-Package DotNetty.Handlers - ...

  5. Surging学习笔记(一)

    一.Surging框架简介 surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用,服务引擎支持http.TCP.WS.Mqtt协议,采用Zookeeper.Consul作为surgin ...

  6. DotNetty完全教程(一)

    写本系列文章的目的 我一直以来都在从事.NET相关的工作,做过工控,做过网站,工作初期维护过别人写的网络库,后来自己写网络库,我发现在使用C#编程的程序员中,能否写出高性能的网络库一直都是考验一个程序 ...

  7. dotnetty java netty,DotNetty发送请求的最佳实践

    长链接发送request/response时, 绝大部分包都是小包, 而每个小包都要消耗一个IP包, 成本大约是20-30us, 普通千兆网卡的pps大约是60Wpps, 所以想要提高长链接密集IO的 ...

  8. DotNetty使用之Echo

    一.DotNetty介绍 DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布.不但使用了C#和.Net平台的技术特点,并且保留了Netty原来绝大部分的编程接口.让我们在使用时 ...

  9. dotnetty java netty,Netty(DotNetty)原理解析

    一.背景介绍 DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布.不但使用了C#和.Net平台的技术特点,并且保留了Netty原来绝大部分的编程接口.让我们在使用时,完全可以依 ...

最新文章

  1. 送一款巧克力式绝美键盘!真香!
  2. 匿名函数、普通函数、箭头函数作用域
  3. 统信uos系统考试题_离Windows更近一步!微信Linux原生版上线:国产统信UOS系统已适配...
  4. mysql常用的存储引擎_Mysql存储引擎
  5. IntelliJ Idea取消Could not autowire. No beans of 'xxxx' type found的错误提示
  6. css就近原则_CSS的引入方式和优先级
  7. 目前选择四核处理器移动平台,是最佳时机吗?
  8. 小宇飞刀与xieyunc
  9. iOS 静态库,动态库与 Framework 浅析
  10. Java人脸识别登录案例(基于百度人脸识别AI)
  11. 前端基础之HTML5音视频标签(video/audio)讲解
  12. dev、test和staging、prod是什么意思?
  13. 借用 AWS 服务 CodePipeling + ECS 实现蓝绿发布 (awscli)
  14. Pytorch-IMDB电影评论情感分析
  15. window 脚本文件.bat获取最高权限拷贝文件及c++调用.bat文件示例
  16. 私有云和服务器虚拟化的区别,私有云和服务器有什么区别
  17. 客户关系管理系统(CRM)的开发过程中使用到的开发工具总结
  18. 行为管理(锐捷睿易篇)
  19. 行业思考 | 互联网对传统行业的降维打击
  20. php捕捉Warning、Notice错误

热门文章

  1. linux rz工具怎么用,Linux和Windows间文件传输工具rz/sz(lrz/lsz) 介绍
  2. 在linux中安装pip
  3. IOS上架因为2.3.1被拒绝
  4. Linux服务器重启命令大全
  5. 2020年6月下旬,离开工作了三年多的老东家
  6. IDEA去掉波浪线之解决方法
  7. c语言编程新思路期末考试答案,2020知到C语言编程新思路章节期末答案
  8. 蓬莱小课:数据分析面试中会问到的问题大汇总
  9. JS刷新当前页面的方法总结
  10. Python 实现功能 --- 微信机器人