DotNetty z
使用说明
客户端的代码和服务端的代码相差很少,体现了Netty统一的编程模型。有几个不同点:
- 客户端的Bootstrap不是ServerBootstrap;
- 客户端不需要主线程组,只有工作线程组,消息处理管道也建立在主线程工作组的拦截通道上;
- 最后不是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
DotNetty z的更多相关文章
- 【Python】使用torrentParser1.03对多文件torrent的分析结果
Your environment has been set up for using Node.js 8.5.0 (x64) and npm. C:\Users\horn1>cd C:\User ...
- .NET Core微服务之路:利用DotNetty实现一个简单的通信过程
上一篇我们已经全面的介绍过<基于gRPC服务发现与服务治理的方案>,我们先复习一下RPC的调用过程(笔者会在这一节的几篇文章中反复的强调这个过程调用方案),看下图
- Android立体旋转动画实现与封装(支持以X、Y、Z三个轴为轴心旋转)
本文主要介绍Android立体旋转动画,或者3D旋转,下图是我自己实现的一个界面 立体旋转分为以下三种: 1. 以X轴为轴心旋转 2. 以Y轴为轴心旋转 3. 以Z轴为轴心旋转--这种等价于andro ...
- Z字形扫描(201412-2)
问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 3 9 3 7 5 ...
- 【IOS】将一组包含中文的数据按照#ABC...Z✿分组
上一篇文章[IOS]模仿windowsphone列表索引控件YFMetroListBox里面 我们一步步的实现了WindowsPhone风格的索引. 但是有没有发现,如果你要实现按照字母排序,你还得自 ...
- Java 压缩/ 解压 .Z 文件
1.问题描述 公司项目有需要用 JAVA 解压 .z文件. .z 是 unix 系统常见的压缩文件. 2.源码 import com.chilkatsoft.CkUnixCompress; impor ...
- 中文编程语言Z语言开源正式开源!!!
(Z语言基于.NET环境,源码中有很多高技术的代码,让更多的人知道对大家有会有很好的帮助,请管理员一点要批准放在首页) 本人实现的中文编程语言Z语言现在正式开源,采用LGPL协议. 编译器核心的网址为 ...
- CCF——Z字形扫描问题
试题编号: 201412-2 试题名称: Z字形扫描 时间限制: 2.0s 内存限制: 256.0MB 问题描述: 问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag ...
- Z.ExtensionMethods 一个强大的开源扩展库
今天有意的在博客园里面搜索了一下 Z.ExtensionMethods 这个扩展类库,确发现只搜到跟这个真正相关的才两篇博文而已,我都点进去看了一下,也都只是提到而已,没有专门介绍,才引起我写这篇文档 ...
随机推荐
- K最近邻kNN-学习笔记
# -*- coding: utf-8 -*- """ Created on Thu Jan 24 09:34:32 2019 1. 翼尾花数据 2. 用 KNeighb ...
- js检测当前设备是移动端还是PC端
加上下面js即可 硬核判断: <script type="text/javascript"> //平台.设备和操作系统 var system ={ win : fals ...
- 一张纸,折多少次和珠穆拉峰一样高(for if 和break)
- Java基础99 待续
1.待续 原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/107 ...
- body-parser Node.js(Express) HTTP请求体解析中间件
body-parser Node.js(Express) HTTP请求体解析中间件 2016年06月08日 781 声明 在HTTP请求中,POST.PUT和PATCH三种请求方法中包 ...
- 性能测试十一:jmeter进阶之java请求
使用Java编写JDBC脚本对Mysql进行增删改查等操作的性能测试 使用Jmeter提供的脚本框架依赖的jar包(分别在jmeter目录下的lib和ext目录下) ApacheJMeter_core ...
- 文件中用WriteLine追加内容的两种方法
if (!Directory.Exists("C:\\testll")) { Directory.CreateDirectory("C:\\testll"); ...
- CSS3:透明度
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Android Rom build.prop文件详解
# begin build properties # autogenerated by buildinfo.sh #以下内容由脚本在编译时自动产生 ro.build.id=6.7.7_97 ...
- Python debug 调试;
F9:执行跳到下一个断点 F8:执行下一步 F7:进入函数