【转载】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中关于编码和解码器的代码如下:

  1. bootstrap
  2. .Option(ChannelOption.SoBacklog, 10000)
  3. .Handler(new LoggingHandler("SRV-LSTN"))
  4. .ChildHandler(new ActionChannelInitializer<IChannel>(channel =>
  5. {
  6. IChannelPipeline pipeline = channel.Pipeline;
  7. if (tlsCertificate != null)
  8. {
  9. pipeline.AddLast("tls", TlsHandler.Server(tlsCertificate));
  10. }
  11. pipeline.AddLast(new LoggingHandler("SRV-CONN"));
  12. pipeline.AddLast("编码器", new LengthFieldPrepender(2));
  13. pipeline.AddLast("解码器", new LengthFieldBasedFrameDecoder(ushort.MaxValue, 0, 2, 0, 2));
  14.  
  15. pipeline.AddLast("echo", new EchoServerHandler());
  16. }));
  1. LengthFieldPrepender为什么是编码器,LengthFieldBasedFrameDecoder为什么是解码器,我们来看相关的代码实现:
    public class LengthFieldPrepender : MessageToMessageEncoder<IByteBuffer>
    public class LengthFieldBasedFrameDecoder : ByteToMessageDecoder
    也就是说,LengthFieldPrepender类就是对应了编码操作,而LengthFieldBasedFrameDecoder类就是对应了解码操作。

DotNetty 学习的更多相关文章

  1. [转载]DotNetty 学习

    [转载]http://www.cnblogs.com/littlegod/p/7699482.html DotNetty的学习是带着如下这些问题展开: 1. Socket基础框架方案: 通信模式:异步 ...

  2. DotNetty学习笔记

    DotNetty项目本身的示例很容易运行起来,但是具体到真实的应用场景,还是需要进一步理解DotNetty的通道处理细节,这样才能够在实际项目应用中处理具体的问题. 简单的场景下会有以下几个问题,第一 ...

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

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

  4. DotNetty网络通信框架学习

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

  5. DotNetty网络通信框架学习之源码分析

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

  6. .NET Core微服务学习-DotNetty

    DotNetty介绍: DotNetty是Azure团队仿照(几乎可以这么说)JAVA的Netty而出来的(目前已实现Netty的一部分),目前在Github上的Star有1.8K+, 地址:http ...

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

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

  8. 通信传输利器Netty(Net is DotNetty)介绍

    (先埋怨一下微软大大)我们做NET开发,十分羡慕JAVA上能有NETTY, SPRING, STRUTS, DUBBO等等优秀框架,而我们NET就只有干瞪眼,哎,无赖之前生态圈没做好,恨铁不成钢啊.不 ...

  9. 开源 DotNetty 实现的 Modbus TCP/IP 协议

    本项目的目的是为了学习 DotNetty 与 Modbus 协议,参考 modjn 实现功能 0x01: Read Coils (读取线圈/离散量输出状态) 0x02: Read Discrete I ...

随机推荐

  1. ubuntu16。04LST配置nfs实现服务器和客户端共享文件

    NFS(network file system)网络文件系统可以实现不同主机与操作系统之间通过网络进行资源共享,此时一台PC充当服务器,若干台PC充当那客户端,具体如何配置请跟随我的步骤来做 1 下载 ...

  2. [转] CSSOM视图模式(CSSOM View Module)相关整理

    以下就是一些API属性的相关内容,包括兼容性,使用,测试等. 一.Window视图属性 这些属性可以hold住整个浏览器窗体大小.微软则将这些API称为“Screenview 接口”.包括:inner ...

  3. Java第三阶段学习(六、多线程)

    一.进程和线程的区别: 进程:指正在运行的程序,当一个程序进入内存运行,就变成一个进程. 线程:线程是进程的一个执行单元. 总结:一个程序运行后至少会有一个进程,一个进程可以有多个线程. 多线程:多线 ...

  4. AC自动机学习笔记-2(Trie图&&last优化)

    我是连月更都做不到的蒟蒻博主QwQ 考虑到我太菜了,考完noip就要退役了,所以我决定还是把博客的倒数第二篇博客给写了,也算是填了一个坑吧.(最后一篇?当然是悲怆のnoip退役记啦QAQ) 所以我们今 ...

  5. VS C++ 并发编程

    1.VS2012及以上版本,支持C++11 thread类的并发编程. 相关材料可以参考博客:http://www.cnblogs.com/rangozhang/p/4468754.html 2.但对 ...

  6. 黑马程序员_java基础笔记(14)...交通灯管理系统_编码思路及代码

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 1,面试题——交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: ...

  7. 【LeetCode刷题】SQL-Second Highest Salary 及扩展以及Oracle中的用法

    转载于:https://www.cnblogs.com/contixue/p/7057025.html Write a SQL query to get the second highest sala ...

  8. oracle数据库连接错误解决办法

    ORA-28547 连接服务器失败,可能是Oracle Net 管理错误 原文地址:http://www.linuxidc.com/Linux/2014-11/109686.htm 上周去给客户培训O ...

  9. 关于XML解析中的CDATA的简单介绍

    所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA PCDATA 指的是被解析的字符数据(Parsed Chara ...

  10. JDBC之 大数据内容的传输

    JDBC之 大数据内容的传输 什么是大数据内容? 在数据库中,有一条一条的记录,记录中很多字段都是几个字符就够的,假如现在要把一部小说存入数据库,这本小说当然不是几个字符组成,而是由几万字组成,这本小 ...