.net core高性能通讯开源组件BeetleX

BeetleX

beetleX是基于dotnet core实现的轻量级高性能的TCP通讯组件,使用方便、性能高效和安全可靠是组件设计的出发点!开发人员可以在Beetlx组件的支持下快带地构建高性能的TCP通讯服务程序,在安全通讯方面只需要简单地设置一下SSL信息即可实现可靠安全的SSL服务。

项目地址:https://github.com/IKende/BeetleX  国内地址:https://gitee.com/ikende/BeetleX

使用方便性

beetleX网络流读写是基于Stream标准来构建,仅仅基于Stream的基础读写对于应用者来说还是过于繁琐;组件为了更方便进行网络数据处理在Stream的基础之上扩展了一系列的读写规则:ReadLine、ReadInt、WriteLine、WriteInt等一系列简便方法,在这些方法的支持下使用者就可以更轻松地处理数据;为了在网络通讯中更好的兼容其他平台协议以上方法都兼容Big-Endian和Little-Endian不同方式。为了更好地利用现有序列化组件,组件通过IPacket接口规范消息扩展,通过实现不同的Packet解释器,即可以实现基于Protobuf,json和Msgpack等方式的对象数据传输。

高性能特性

beetleX的高性能是建立在内部一个数据流处理对象PipeStream,它是构建在Stream标准之上;它和.NET内置的NetworkStream最大的差别是PipeStream的读写基于SocketAsyncEventArgs实现,这正是在编写高性能网络数据处理所提倡的模式。PipeStream不仅在网络数据处理模式上有着性能的优势,在内存读写上和MemoryStream也有着很大的区别;由于PipeStream的内存块是以一个基于链表的SocketAsyncEventArgs Buffer 组成,因此PipeStream在写入大数据的情况并不存在内存扩容和复制的问题;基于SocketAsyncEventArgs Buffer作为基础内存块还有一个好处是在协议数据和网络缓存读写并不存在内存块复制。如果在应用中中使用PipeStream相应的BinaryReader和IBinaryWriter读写规范,那大部分数据处理基本不存在内存复制过程,从而让数据处理性能更高效。

以下是PipeStream的结构: PipeStream

性能

beetleX的性能到底怎样呢,以下简单和DotNetty进行一个网络数据交换的性能测试,分别是1K,5K和10K连接数下数据请求并发测试

DotNetty测试代码

   public override void ChannelRead(IChannelHandlerContext context, object message){var buffer = message as IByteBuffer;context.WriteAsync(message);}

Beetlex 测试代码

        public override void SessionReceive(IServer server, SessionReceiveEventArgs e){server.Send(e.Stream.ToPipeStream().GetReadBuffers(), e.Session);base.SessionReceive(server, e);}

测试结果

1K connections

PipeStreamPipeStream

5K connections

PipeStreamPipeStream

10K connections

PipeStreamPipeStream

构建TCP Server

    class Program : ServerHandlerBase{private static IServer server;public static void Main(string[] args){NetConfig config = new NetConfig();//ssl//config.SSL = true;//config.CertificateFile = @"c:\ssltest.pfx";//config.CertificatePassword = "123456";server = SocketFactory.CreateTcpServer<Program>(config);server.Open();Console.Write(server);Console.Read();}public override void SessionReceive(IServer server, SessionReceiveEventArgs e){string name = e.Stream.ToPipeStream().ReadLine();Console.WriteLine(name);e.Session.Stream.ToPipeStream().WriteLine("hello " + name);e.Session.Stream.Flush();base.SessionReceive(server, e);}}

构建TCP Client

    class Program{static void Main(string[] args){TcpClient client = SocketFactory.CreateClient<TcpClient>("127.0.0.1", 9090);//ssl//TcpClient client = SocketFactory.CreateSslClient<TcpClient>("127.0.0.1", 9090, "localhost");while (true){Console.Write("Enter Name:");var line = Console.ReadLine();client.Stream.ToPipeStream().WriteLine(line);client.Stream.Flush();var reader = client.Read();line = reader.ToPipeStream().ReadLine();Console.WriteLine(line);}Console.WriteLine("Hello World!");}}

异步Client

    class Program{static void Main(string[] args){AsyncTcpClient client = SocketFactory.CreateClient<AsyncTcpClient>("127.0.0.1", 9090);//SSL//AsyncTcpClient client = SocketFactory.CreateSslClient<AsyncTcpClient>("127.0.0.1", 9090, "serviceName");client.ClientError = (o, e) =>{Console.WriteLine("client error {0}@{1}", e.Message, e.Error);};client.Receive = (o, e) =>{Console.WriteLine(e.Stream.ToPipeStream().ReadLine());};var pipestream = client.Stream.ToPipeStream();pipestream.WriteLine("hello henry");client.Stream.Flush();Console.Read();}}

实现一个Protobuf对象解释器

    public class Packet : FixedHeaderPacket{public Packet(){TypeHeader = new TypeHandler();}private PacketDecodeCompletedEventArgs mCompletedEventArgs = new PacketDecodeCompletedEventArgs();public void Register(params Assembly[] assemblies){TypeHeader.Register(assemblies);}public IMessageTypeHeader TypeHeader { get; set; }public override IPacket Clone(){Packet result = new Packet();result.TypeHeader = TypeHeader;return result;}protected override object OnReader(ISession session, PipeStream reader){Type type = TypeHeader.ReadType(reader);int bodySize = reader.ReadInt32();return reader.Stream.Deserialize(bodySize, type);}protected override void OnWrite(ISession session, object data, PipeStream writer){TypeHeader.WriteType(data, writer);MemoryBlockCollection bodysize = writer.Allocate(4);int bodyStartlegnth = (int)writer.CacheLength;ProtoBuf.Meta.RuntimeTypeModel.Default.Serialize(writer.Stream, data);bodysize.Full((int)writer.CacheLength - bodyStartlegnth);}}

 BeetleX的介绍暂时到这里,如果需要了解项目的情况可以到Github下载相关代码和Samples,如果有疑问可以在Gibhub上提相关issue。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

按组排名

rank() over,dense_rank() over,row_number() over的区别 1.rank() over&#xff1a;查出指定条件后的进行排名。特点是&#xff0c;加入是对学生排名&#xff0c;使用这个函数&#xff0c;成绩相同的两名是并列&#xff0c;下一位同学空出所占的名次。 select name,subject,sc…

《Excel与VBA程序设计》第一章

点击下载&#xff1a;http://files.cnblogs.com/maweifeng/Excel_VBA_001.rar转载于:https://www.cnblogs.com/maweifeng/archive/2005/06/23/179729.html

linux java环境变量设置

JAVA环境变量设置&#xff1a; #vi /etc/profile#在文件最后添加以下内容&#xff1a; export JAVA_HOME/usr/java/jdk1.8.0_91 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar 执行如下命令使环境变量生效&#xff1a; s…

win7 磁盘分区

右键点击“我的电脑”&#xff0c;选择“管理”命令。在打开的“计算机管理”窗口中&#xff0c;依次展开“计算机管理”→“存储”→“磁盘管理”项。之后&#xff0c;在右侧窗格中即可看到当前硬盘的分区情况。 在“未指派”的磁盘空间上点击右键&#xff0c;选择“新建磁盘…

[FxCop.设计规则]13. 定义自定义属性参数的访问属性

13. 定义自定义属性参数的访问属性 翻译概述&#xff1a; 一个比较无聊的规则&#xff0c;实在看不出在什么情况下&#xff0c;一个开发者会做出违反这条规则的设计。没有别的内容&#xff0c;只是说应该为自定义特性的构造函数中的参数提供一个相关的属性去读取它们的值。…

C语言程序设计实验最短路径,7最短路径C语言程序设计.pdf

最短路径旅行家的困扰第4章 图结构 解放军理工大学旅行家的困扰新疆特克斯县“八卦城”第4章 图结构 解放军理工大学旅行家的困扰特克斯县怎么样帮助困扰的旅行家找到去各个地点的最短路线呢&#xff1f;旅行家居住的旅馆旅行家想去的地点第4章 图结构 解放军理工大学问题建模使…

centos7安装Cloudera Manager

第一部分&#xff1a;准备工作一&#xff0c;修改hostname $vim /etc/sysconfig/network $source /etc/sysconfig/network例如&#xff1a; NETWORKINGyes HOSTNAMEspark01reboot重启服务器 二&#xff0c;关闭selinux查看SELinux状态1&#xff0c;/usr/sbin/sestatus -v #如果…

He Fei ,First ,Good Luck

Tonight, I will go to HeFei.something as follows:1) speciality 2) sincerely3) valueHope i can bring customer some ideas .But i will throw my 100% energy to face it.Good Luck.First HeFei转载于:https://www.cnblogs.com/boriscao/archive/2005/08/31/227199.html…

在C#中使用代理的方式触发事件 的简单习作

程序简单就 不再作说明了.在学习IssueVision的OBSERVER(观察者)模式时由于对代理和事件不是很熟悉,遇到了一些问题,所以就有了这个简单习作.TestEvent.cs using System; namespace ConsoleApplication2{ /// <summary> /// Class1 的摘要说明。 /// </summar…

c语言递归有何作用,c语言中,什么是函数的递归,能举个例子么

(PS:因为很多IT术语的定义都来源于国外&#xff0c;我们看的中文大部分是别人看了国外的文献然后以他的中文素养加以解释的&#xff01;但是中华语言博大精深&#xff01;而英语就较为简单了&#xff0c;记得上次看高德纳的《surrealnumber》时候&#xff0c;文中有一句“thebe…

Nodejs 文件上传

node js 接收表单数据原理 /*** node js 接收表单数据*/ const http require("http"); const qs require("querystring");http.createServer((request, response) > {// 表单提交的原理if (request.url "/post" && request.meth…

c语言程序设计 银行整存整取,《C语言程序设计习题试题集》.doc

《C语言程序设计习题试题集》.doc1、已知银行整存整取存款不同期限的月息利率分别为&#xff1a;0.315% 期限一年0.330% 期限二年0.345% 期限三年0.375% 期限五年0.420% 期限八年要求输入存钱的本金和期限&#xff0c;求到期时能从银行得到的利息与本金的合计。2、输入年份year…

Grove——.NET中的ORM实现

Grove——.NET中的ORM实现 发布日期&#xff1a; 6/30/2005| 更新日期&#xff1a; 6/30/2005作者&#xff1a;林学鹏 ORM的全称是Object Relational Mapping&#xff0c;即对象关系映射。它的实质就是将关系数据&#xff08;库&#xff09;中的业务数据用对象的形式表示出来&a…

let和const

发布自Kindem的博客&#xff0c;欢迎大家转载&#xff0c;但是要注意注明出处。另外&#xff0c;该文章收纳在Kindem的个人的 IT 知识整理仓库&#xff0c;欢迎 Star、Fork、投稿 let let是在ES6加入的新的变量声明方法&#xff0c;let声明变量的方法和var类似: let a hello; …

GIT 操作笔记

设置不用每次都输入 账号密码 git config --global credential.helper store然后&#xff0c;下次再输入一次 账号密码 就可以了。删除github上的文件$ git pull origin master 将远程仓库里面的项目拉下来$ dir 查看有哪些文件夹$ git rm -r --cached target 删除target文件…

[book]道法自然

前不久读了王咏刚的〈凌波微步〉和〈凌波微步II〉&#xff0c;感觉不错。今天把他老人家的《道法自然》也买了下来。在dearbook看到关于这本书的长篇大评&#xff0c;也一块copy了下来&#xff1a;http://www.dearbook.com.cn/book/viewbook.aspx?pnoTS0023954认真的作者&…

c语言编手机蓝牙软件的代码,51单片机C语言的简易蓝牙锁代码

#include#define uint unsigned int#define uchar unsigned charuchar r_buf; //蓝牙接收到的字符存储缓冲区sbit PWMAP2^0; //电机驱动模块接口sbit IN1P2^2;sbit IN2P2^1;sbit STBYP2^3;sbit LED1P0^0; //LED灯接口sbit LED2P0^1;sbit LED3P0^2;sbit key1P1^0;…

列表嵌套字典,根据字典某一key排序

在返回列表嵌套字典时候&#xff0c;往往需要对数据进行一定的处理&#xff1a;按照字典中某一个key排序 In [87]: a [{"name": "牛郎", "age": 23},{"name":"许仙", "age": 20},{"name":"董永&q…

display: inline-block 布局

三个元素display: inline-block; 布局 &#xff0c;其中一个元素中存在其他元素也用了display: inline-block; 无法垂直居中&#xff0c;将这个元素设置为display: inline; 转载于:https://www.cnblogs.com/Running00/p/11163751.html

GCC精彩之旅

在为Linux开发应用程序时&#xff0c;绝大多数情况下使用的都是C语言&#xff0c;因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。目前 Linux下最常用的C语言编译器是GCC&#xff08;GNU Compiler Collection&#xff09;&#xff0c;它是GNU项目中符合ANSI…