使用Beetle简单构建高性能Socket tcp应用
beetle是基于c#编写的高性能Socket tcp组件,它基于SocketAsyncEventArgs的实现并提供了发送队列和接收队列的支持,可以根据情况灵活地设置1-N个发送队列和接收队列。除了队列上的支持组件还提供Buffer缓冲池和基于Buffer的DataWriter,DataReader对象,从而达到消息可以灵活地分布在多个Buffer中,实现更好的内存利率.为了使处理更高效组件使用多个SocketAsyncEventArgs对数据进行处理,可以同时进行接收和发送操作.经测试beetle可以在一些比较旧的电脑上(core e4300 1.8g)的电脑可以进行6W个以上的send或receive操作,并包括数据包分析、对象写入缓冲或从缓冲中读取;就是说可以处理3W个请求并进行数据流分析反序列化对象的同时重新写入缓冲发送出去;这些测试表明组件提供非常好的性能支持[详情]。
在使用上传统Socket编写tcp应虽然不是复杂但写起来也是件麻烦的事情,还要处理分包和粘包上的问题。但beetle都解决了以上问题,所有操作都是基于方法和事件来实现,只需要在便建一个对象简单的绑定一个事件就能完成工作。组件还提供基于分隔符和头描述大小的方式数据流分包功能,从而让开发人员有更多的时候专注于逻辑功能的编写。
以下介绍如何通过Beetle实现一个简单的socket tcp通讯程序。
首先看一下如何制订一个socket的监听服务:
TcpUtils.Setup(100, 1, 1); mServer = new TcpServer(); mServer.ChannelConnected += OnConnected; mServer.ChannelDisposed += OnDisposed; mServer.Open(9133);
在使用组件之前先调用TcpUtils.Setup方法来初始化组件,以上代码是预先分配100个连接缓冲,分配1组Buffer缓冲池,一个发送队列和接收队列。这里可以根据情况的需要来定义相关的数值。初始化完成后的工作就是创建一个TcpServer对象,并绑定两个主要的事件连接接入和连接释放;以上工作处理完成后通过调用Open方法打开即可,在不指定IP的情况是绑定当前系统的所有IP。
以上代码就完成一个简单的socket tcp服务的构建,但要对连接制行数据接收还需要编写几行简单的代码:
static void OnConnected(object sender, ChannelEventArgs e) { Console.WriteLine("{0} connected!", e.Channel.EndPoint); e.Channel.DataReceive += OnReceive; e.Channel.ChannelError += OnError; e.Channel.BeginReceive(); } static void OnReceive(object sender, ChannelReceiveEventArgs e) { Console.WriteLine(e.Channel.Coding.GetString(e.Data.Array, e.Data.Offset, e.Data.Count)); }
在连接接入的事件中我们需要对连接的接收数据事件绑定一下,并调用BeginReceive()方法即可以。以上功能只是把接收的数据简单的输出到控制台。
到这里整个服务端就已经完成了,运行个程序只需要通过telnet 127.0.0.1 9133就能测试其工作情况。
接下来我们同样用Beetle写一个简单的客户端程序接入这个服务,其实写起来和服务端一样的简单:
mChannel = TcpServer.CreateClient(ip, 9133); mChannel.ChannelError += OnError; mChannel.DataReceive += OnReceive; mChannel.BeginReceive();
只需要通过TcpServer.CreateClient方法即向指定的IP端口创建连接,创建之后绑定相关事件即可.
下面就是构造简单的循还来获取用户的输入并发送到服务端,当輸入为exite的时候退。
INPUT: Console.Write("Command:"); Console.ForegroundColor = ConsoleColor.Green; command = Console.ReadLine(); if (command.IndexOf("exit") == -1) { StringMessage msg = new StringMessage(); msg.Value = command; mChannel.Send(msg); goto INPUT; } mChannel.Dispose(); Console.Read();
这样一个简单的客户也完成,下面看下运行结果
这事例主要体现运用Beetle简单的实现了一个Socket tcp的应用通讯程序,在下一章会通过实现一个简单的聊天室来讲述Beetle如何制定对象协议和使用ChannelAdapter进行自定义数据协议分析。
如果你想知道Beetle可以做什么,这里提供一个基于Beetle实现免费的网络文件管理工具 缺点他暂时只能运行在装有.net 2.0sp1的系统上,如果有更充足的时间会移植到mono上.
下载该文章的事例代码: