.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的结构:
性能
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
5K connections
10K connections
构建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", );
//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", );
//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();
int bodyStartlegnth = (int)writer.CacheLength;
ProtoBuf.Meta.RuntimeTypeModel.Default.Serialize(writer.Stream, data);
bodysize.Full((int)writer.CacheLength - bodyStartlegnth);
}
}
BeetleX的介绍暂时到这里,如果需要了解项目的情况可以到Github下载相关代码和Samples,如果有疑问可以在Gibhub上提相关issue。
.net core高性能通讯开源组件BeetleX的更多相关文章
- BeetleX高性能通讯开源组件
net core高性能通讯开源组件BeetleX https://www.cnblogs.com/smark/p/9617682.html BeetleX beetleX是基于dotnet core实 ...
- .NET Core/.NET5/.NET6 开源项目汇总1:常用必备组件
系列目录 [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...
- 微信自用高性能通用key-value组件MMKV已开源!
1.MMKV简介 腾讯微信团队于2018年9月底宣布开源 MMKV ,这是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,主打高性能和稳定性.近 ...
- .NET Core开源组件:后台任务利器之Hangfire 转载 https://www.cnblogs.com/chenug/p/6655636.html
.NET Core开源组件:后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的D ...
- .NET Core/.NET5/.NET6 开源项目汇总12:WPF组件库2
系列目录 [已更新最新开发文章,点击查看详细] WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Frame ...
- .NET Core/.NET5/.NET6 开源项目汇总11:WPF组件库1
系列目录 [已更新最新开发文章,点击查看详细] WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Frame ...
- .NET Core/.NET5/.NET6 开源项目汇总4:CMS、Blog项目
系列目录 [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...
- 这些 .Net and Core 相关的开源项目,你都知道吗?(持续更新中...)
最近更新时间2017-12-28 序列化 Json.NET http://json.codeplex.com/Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Ne ...
- 微信团队分享:iOS版微信的高性能通用key-value组件技术实践
本文来自微信开发团队guoling的技术分享. 1.前言 本文要分享的是iOS版微信内部正在推广和使用的一个高性能通用key-value 组件的技术实践过程,该组件在微信内部被命名为MMKV(以下简称 ...
随机推荐
- selenium操作浏览器的前进和后退
前进关键字:driver.forward() 后退关键字:driver.back() 测试对象:1.https://www.baidu.com/ 2.https://www.sogou.com/ 实例 ...
- python3安装lxmlpipinstall安装失败解决办法
最近在学习python爬虫技术,lxml模块拥有很强大的获取元素功能,但是安装时总超时报错,如下解决办法 选择好python版本→注意pip版本→下载对应lxml.whl→键入对应的字符串→bingo ...
- JavaOOP笔记
http://note.youdao.com/noteshare?id=bbdc0b970721e40d327db983a2f96371
- BZOJ 4665
orz gery 一发rk1真有趣(其实我没想着常数优化 inline int sqr(int x){return 1ll*x*x%mo;} const int N=2011; int n,a[N], ...
- go http
先看一个简单的 tcp 连接: // server ln, err := net.Listen("tcp", ":8000") if err != nil {} ...
- 软件工程第三周的学习报告 html<input> final finally finalize 的比较 BigInteger
三月十三号下午: html的<input>的三个属性pattern(限定用户的输入格式)与placeholder(显示的)与required(不能为空) 代码案例: pattern与pla ...
- 我们来谈谈最近最热门的微信小程序
最近微信小程序真是火到不行,我们的经理大人也就此给我做了一定的培训.他讲的太好,我实在忍不住跟大家简单分享一下: 1.什么是微信小程序? 一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦 ...
- 机器学习--------SVM
#SVM的使用 (结合具体代码说明,代码参考邹博老师的代码) 1.使用numpy中的loadtxt读入数据文件 data:鸢尾花数据 5.1,3.5,1.4,0.2,Iris-setosa 4.9,3 ...
- 你不知道的JS之作用域和闭包(五)作用域闭包
原文:你不知道的js系列 一个简单粗暴的定义 闭包就是即使一个函数在它所在的词法作用域外部被执行,这个函数依然可以访问这个作用域. 比如: function foo() { var a = 2; fu ...
- Java基础实训