使用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上.
下载该文章的事例代码:
Beelet.Samples.rar (197.56 kb)
使用Beetle简单构建高性能Socket tcp应用的更多相关文章
- 使用Beetle简单构建聊天室程序
之前已经讲解了Beetle简单地构建网络通讯程序,那程序紧紧是讲述了如何发送和接收数据:这一章将更深入的使用Beetle的功能,主要包括消息制定,协议分析包括消息接管处理等常用的功能.为了更好的描述所 ...
- Beetle简单构建TCP服务
使用Beetle构建TCP服务应用是件非常简单的事情,它并不需要你去关注Socket细节,如果你想用Socket编写高性能的TCP服务,那你要关注的东西非常多,异步数据处理,大量连接下的线程管理和连接 ...
- ActionScript简单实现Socket Tcp应用协议分析器
转自..smark http://www.cnblogs.com/smark/archive/2012/05/15/2501507.html ActionScript简单实现Socket Tcp应用协 ...
- 【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施
原文:[原创]构建高性能ASP.NET站点 第六章-性能瓶颈诊断与初步调优(下前篇)-简单的优化措施 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施 前言:本篇 ...
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截
程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构 .要想在之后的江湖历练中通关,数据结构必不可少. ...
- 基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现
设计概述 服务端通信组件的设计是一项非常严谨的工作,其中性能.伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性.可用 ...
- 构建高性能WEB站点笔记三
构建高性能WEB站点笔记三 第10章 分布式缓存 10.1数据库的前端缓存区 文件系统内核缓冲区,位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经 ...
- 构建高性能WEB站点笔记二
构建高性能WEB站点笔记 因为是跳着看的,后面看到有提到啥epoll模型,那就补充下前面的知识. 第三章 服务器并发处理能力 3.2 CPU并发计算 进程 好处:cpu 时间的轮流使用.对CPU计算和 ...
- 构建高性能高并发Java系统 .
转:http://blog.csdn.net/nengyu/article/details/7591854 场景这里指的高性能高并发服务器是一个有状态的服务,可以理解成web或者socket服务器,每 ...
随机推荐
- Linux反编译
转自:http://bbs.pediy.com/showthread.php?threadid=11315 一个简单的linux crackme的逆向前言 最不喜欢的就是写破解教程,酒后一时冲动 ...
- java 中xml转换为json对象
1.前提须要jar包: json-lib-2.4-jdk15.jar 和 xom-1.2.5.jar ,maven 仓库: net.sf.json-lib json-lib 2.4 jdk15 xom ...
- glGetString(GL_VERSION) returns “OpenGL ES-CM 1.1” but my phone supports OpenGL 2
[问] I'm trying to make an NDK based OpenGL application. At some point in my code, I want to check ...
- C#调用MySQL数据库(使用MySql.Data.dll连接)mysql-connector-net-6.10.4.msi
下载地址:http://dev.mysql.com/downloads/connector/net/ 安装指导 1.安装:mysql-connector-net-6.10.4.msi 其下载地址:ht ...
- OpenGL ES 3.0之Uniform详解
Uniform是变量类型的一种修饰符,是OpenGL ES 中被着色器中的常量值,使用存储各种着色器需要的数据,例如:转换矩阵.光照参数或者颜色. uniform 的空间被顶点着色器和片段着色器分享 ...
- Spatis service单元测试: 使用mock mapper的方式
转载:https://blog.csdn.net/atec2000/article/details/54346242 @RunWith(MockitoJUnitRunner.class)public ...
- Linq中的连接(join)
http://www.cnblogs.com/scottckt/archive/2010/08/11/1797716.html Linq中连接主要有组连接.内连接.左外连接.交叉连接四种.各个用法如下 ...
- 1052: 旋转单词(words)
#include <iostream> #include <iomanip> #include <cstdlib> #include <string> ...
- 12 个非常实用的 jQuery 代码片段
jQuery是一个非常流行而且实用的JavaScript前端框架,本文并不是介绍jQuery的特效动画,而是分享一些平时积累的12个jQuery实用代码片段,希望对你有所帮助. 导航菜单背景切换效果 ...
- cocos2d-js 和 createjs 性能对比(HTML5)
cocos2d-js除了做native游戏外,还可以用来做HTML5游戏/动画,那么它跟adobe的createjs框架比较会怎么样呢? (背景知识:createjs是adobe支持的HTML5框架, ...