日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/9 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net core高性能通讯开源组件BeetleX 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

BeetleX

beetleX是基于dotnet core實(shí)現(xiàn)的輕量級高性能的TCP通訊組件,使用方便、性能高效和安全可靠是組件設(shè)計(jì)的出發(fā)點(diǎn)!開發(fā)人員可以在Beetlx組件的支持下快帶地構(gòu)建高性能的TCP通訊服務(wù)程序,在安全通訊方面只需要簡單地設(shè)置一下SSL信息即可實(shí)現(xiàn)可靠安全的SSL服務(wù)。

項(xiàng)目地址:https://github.com/IKende/BeetleX? 國內(nèi)地址:https://gitee.com/ikende/BeetleX

使用方便性

beetleX網(wǎng)絡(luò)流讀寫是基于Stream標(biāo)準(zhǔn)來構(gòu)建,僅僅基于Stream的基礎(chǔ)讀寫對于應(yīng)用者來說還是過于繁瑣;組件為了更方便進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)處理在Stream的基礎(chǔ)之上擴(kuò)展了一系列的讀寫規(guī)則:ReadLine、ReadInt、WriteLine、WriteInt等一系列簡便方法,在這些方法的支持下使用者就可以更輕松地處理數(shù)據(jù);為了在網(wǎng)絡(luò)通訊中更好的兼容其他平臺協(xié)議以上方法都兼容Big-Endian和Little-Endian不同方式。為了更好地利用現(xiàn)有序列化組件,組件通過IPacket接口規(guī)范消息擴(kuò)展,通過實(shí)現(xiàn)不同的Packet解釋器,即可以實(shí)現(xiàn)基于Protobuf,json和Msgpack等方式的對象數(shù)據(jù)傳輸。

高性能特性

beetleX的高性能是建立在內(nèi)部一個(gè)數(shù)據(jù)流處理對象PipeStream,它是構(gòu)建在Stream標(biāo)準(zhǔn)之上;它和.NET內(nèi)置的NetworkStream最大的差別是PipeStream的讀寫基于SocketAsyncEventArgs實(shí)現(xiàn),這正是在編寫高性能網(wǎng)絡(luò)數(shù)據(jù)處理所提倡的模式。PipeStream不僅在網(wǎng)絡(luò)數(shù)據(jù)處理模式上有著性能的優(yōu)勢,在內(nèi)存讀寫上和MemoryStream也有著很大的區(qū)別;由于PipeStream的內(nèi)存塊是以一個(gè)基于鏈表的SocketAsyncEventArgs Buffer 組成,因此PipeStream在寫入大數(shù)據(jù)的情況并不存在內(nèi)存擴(kuò)容和復(fù)制的問題;基于SocketAsyncEventArgs Buffer作為基礎(chǔ)內(nèi)存塊還有一個(gè)好處是在協(xié)議數(shù)據(jù)和網(wǎng)絡(luò)緩存讀寫并不存在內(nèi)存塊復(fù)制。如果在應(yīng)用中中使用PipeStream相應(yīng)的BinaryReader和IBinaryWriter讀寫規(guī)范,那大部分?jǐn)?shù)據(jù)處理基本不存在內(nèi)存復(fù)制過程,從而讓數(shù)據(jù)處理性能更高效。

以下是PipeStream的結(jié)構(gòu):?

性能

beetleX的性能到底怎樣呢,以下簡單和DotNetty進(jìn)行一個(gè)網(wǎng)絡(luò)數(shù)據(jù)交換的性能測試,分別是1K,5K和10K連接數(shù)下數(shù)據(jù)請求并發(fā)測試

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);}

測試結(jié)果

1K connections

5K connections

10K connections

構(gòu)建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);}}

構(gòu)建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();}}

實(shí)現(xiàn)一個(gè)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的介紹暫時(shí)到這里,如果需要了解項(xiàng)目的情況可以到Github下載相關(guān)代碼和Samples,如果有疑問可以在Gibhub上提相關(guān)issue。

總結(jié)

以上是生活随笔為你收集整理的.net core高性能通讯开源组件BeetleX的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。