.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.pswp.cn/news/277319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277319.shtml
英文地址,請注明出處:http://en.pswp.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…