• 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类就是对应了解码操作。
  • 相关阅读:
    USACO 1.1-ride
    USACO 1.1-gift1
    USACO 1.1-Friday the Thirteenth
    SQL详解(上)
    Python入门神图
    JSTL标签详解以及应用实例
    EL表达式详解及应用实例
    session应用----登录验证小案例
    各种编码问题产生原因以及解决办法---------响应编码,请求编码,URL编码
    Servlet的request应用案例
  • 原文地址:https://www.cnblogs.com/zeroone/p/8480798.html
Copyright © 2020-2023  润新知