DotNetty z

 
使用说明

客户端的代码和服务端的代码相差很少,体现了Netty统一的编程模型。有几个不同点:

  1. 客户端的Bootstrap不是ServerBootstrap;
  2. 客户端不需要主线程组,只有工作线程组,消息处理管道也建立在主线程工作组的拦截通道上;
  3. 最后不是bind而是connect;

TlsHandler

Netty支持Tls加密传输,TlsHandler类可以在开发人员无须关心加密传输时字节码的变化,只关心自己的业务代码即可。在管道处理的第一个配置该类即可。

LengthFieldPrepender

这个handler 会在实际发送前在将数据的长度放置在数据前,本例中使用2个字节来存储数据的长度。

LengthFieldBasedFrameDecoder

这个handler比较常用,会在解码前用于解析数据,用于读取数据包的头信息,特别是包长,并等待数据达到包长后再交由下一个handler处理。 以下是Amp协议的参数值,并注释了意义

InitialBytesToStrip = 0, //读取时需要跳过的字节数
LengthAdjustment = -5, //包实际长度的纠正,如果包长包括包头和包体,则要减去Length之前的部分
LengthFieldLength = 4, //长度字段的字节数 整型为4个字节
LengthFieldOffset = 1, //长度属性的起始(偏移)位
MaxFrameLength = int.MaxValue, // 最大包长

ChannelHandlerAdapter和SimpleChannelInboundHandler

业务处理的常用Handler基类,一般客户端和服务端的业务处理handler 都要继承这个这两个类,其中SimpleChannelInboundHandler是ChannelHandlerAdapter的子类,对其简单的进行封装,并进行了类型检查。

IdleStateHandler

链接状态检查handler

这个handler一般用于检查链接的状态,比如写超时,读超时。在实际项目中一般在客户端添加它,并用于发送心跳包。以下是DotBPE在客户端管道中 第一个添加IdleStateHandler 并设置触发时间。

var bootstrap = new Bootstrap();
            bootstrap
                .Channel<TcpSocketChannel>()
                .Option(ChannelOption.TcpNodelay, true)
                .Option(ChannelOption.ConnectTimeout, TimeSpan.FromSeconds(3))
                .Group(new MultithreadEventLoopGroup())
                .Handler(new ActionChannelInitializer<ISocketChannel>(c =>
                {
                    var pipeline = c.Pipeline;
                    pipeline.AddLast(new LoggingHandler("CLT-CONN"));
                    MessageMeta meta = _msgCodecs.GetMessageMeta();


                    // IdleStateHandler
                    pipeline.AddLast("timeout", new IdleStateHandler(0, 0, meta.HeartbeatInterval / 1000));
                    //消息前处理
                    pipeline.AddLast(
                        new LengthFieldBasedFrameDecoder(
                            meta.MaxFrameLength,
                            meta.LengthFieldOffset,
                            meta.LengthFieldLength,
                            meta.LengthAdjustment,
                            meta.InitialBytesToStrip
                        )
                    );

                    pipeline.AddLast(new ChannelDecodeHandler<TMessage>(_msgCodecs));
                    pipeline.AddLast(new ClientChannelHandlerAdapter<TMessage>(this));

                }));
            return bootstrap;

然后在业务处理handler中处理UserEventTriggered事件

//ChannelHandlerAdapter 重写UserEventTriggered
public override void UserEventTriggered(IChannelHandlerContext context, object evt){
  if(evt is IdleStateEvent){
     var eventState = evt as IdleStateEvent;
     if(eventState !=null){
        this._bootstrap.SendHeartbeatAsync(context,eventState);
     }
  }
}

防止内存泄漏

通过调试代码,确实发现了 这些 16M 字节所在的位置:

((DotNetty.Buffers.PooledByteBufferAllocator)
    ((DotNetty.Transport.Channels.AbstractChannelHandlerContext)context)
    .Allocator)
        .directArenas

简写就是:

context.Allocator.directArenas
 
    
   

 

 
    
   

 

 
  

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WinForm是一种用于Windows桌面应用程序开发的GUI框架,而DotNetty是一个基于C#的异步网络应用程序框架。它们之间有一些不同和联系。 首先,两者的定位不同。WinForm主要用于开发面向桌面用户的应用程序,可以提供丰富的用户界面和用户交互功能。而DotNetty则是专注于网络应用程序的开发,可以实现高性能的、异步的网络通信。 其次,两者的开发方式也有所不同。WinForm是基于Windows窗体的开发方式,开发者通过拖放控件、设置属性和事件处理等方式来实现应用程序。而DotNetty则是通过编写C#代码来实现各种网络功能,例如TCP/IP通信、WebSocket通信等。 此外,DotNetty还提供了一些额外的功能和优势。由于它是异步的,可以提供更好的性能和响应速度。它也支持开发分布式的、高并发的服务端应用程序,可以应用于实时通信、即时消息等场景。另外,DotNetty还支持SSL/TLS加密通信,能够提供更高的安全性。 综上所述,WinForm和DotNetty在功能和用途上有一定的差异,但它们也可以相互配合使用。例如,可以使用WinForm来开发一个具有用户界面的客户端应用程序,然后使用DotNetty来实现与服务器的异步网络通信。这样可以既能享受到WinForm的便利性,又能利用DotNetty的高性能和强大的网络功能。 ### 回答2: WinForm和DotNetty都是与C#语言和.NET框架相关的技术。 WinForm是一种用于创建Windows桌面应用程序的技术。它是基于Microsoft .NET框架的一部分,提供了一组用于创建用户界面和处理用户输入的类和工具。通过使用WinForm,开发者可以快速创建可视化的桌面应用程序,并使用丰富的控件和功能来满足用户的需求。WinForm应用程序可以在Windows操作系统上运行,并可以通过.NET框架进行部署和维护。 而DotNetty是一个用于构建异步的,事件驱动的网络应用程序的开源框架。它基于C#语言和.Net标准库,提供了高效的网络通信功能,并支持TCP、UDP、HTTP等协议。DotNetty采用了异步和事件驱动的设计模式,可以处理大量的并发连接和请求。它提供了一些高级特性,如流水线处理、心跳检测、SSL加密等,使网络应用程序的开发变得更加简单和灵活。 WinForm和DotNetty可以结合使用,以实现更复杂和强大的网络应用程序。通过将DotNetty集成到WinForm应用程序中,开发者可以实现实时的网络通信和数据交换,例如聊天应用程序、实时数据传输、远程管理等。通过利用DotNetty的高性能和异步处理能力,WinForm应用程序可以处理大量的并发连接和请求,提供更好的用户体验和系统性能。 总结起来,WinForm和DotNetty都是C#和.NET开发中常用的技术,分别用于创建桌面应用程序和构建高性能的网络应用程序。它们可以相互结合使用,实现更复杂和强大的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值