使用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服务器,每 ...
随机推荐
- Spring(十六):泛型依赖注入
简介: Spring4.X之后开始支持泛型依赖注入. 使用示例: 1.定义实体 package com.dx.spring.bean.componentscan; import java.io.Ser ...
- python命令行参数传递JSON串
有点小问题,一是传递的双引号被自动删除了,但是如果用单引号,JSON解析又不认. 所以,最后的方案是,传递单引号,但程序处理时做一个替换,替换成单引号.
- External component has thrown an exception
C#调用c++的DLL报错:External component has thrown an exception, 也没有log产生,怎么回事那? [解决方法] 这是因为c++的程序报错了,而且没有c ...
- IntelliJ IDEA 优化总结
1.修改JVM参数 (IntelliJ IDEA 10.0.1包含以上版本不需要设置) 修改idea.exe.vmoptions配置文件调整以下内容:-Xms256m-Xmx384m-XX:MaxPe ...
- SNS网站的用户流失率怎么会高得如此惊人?
作者:黄绍麟 原51.com高管 用户典型的SNS体验 甲先生是个普通白领,白天工作使用互联网找资料连络客户,下班后回家偶而会上网闲逛.互联网是他日常接触的媒介,但是在他生命中这个东西并不显得特别重要 ...
- ExtJS学习笔记2:响应事件、使用AJAX载入数据
响应事件: 1.设置一个html标记 <div id="my-div">Ext JS 4 Cookbook</div> 2.使用get函数获取此标记对象 v ...
- junit mockito
package com.zendaimoney.util; import static org.mockito.Mockito.*;import static org.junit.Assert.*;i ...
- Android Studio 之 Launch AVD 时" Intel HAXM is required to run this AVD, VT-x is disabled in BIOS; "
问题描述:Launch AVD 时弹窗信息" Intel HAXM is required to run this AVD, VT-x is disabled in BIOS; " ...
- 微软BI 之SSRS 系列 - 报表中分组聚合中处理不规则层次结构的技巧(没有子元素的时候不展开, 删除+符号)
分组聚合的展开和收起效果在SSRS Report中非常常用,并且有时还要处理一些比较特别的情况.比如分组合并时有的层次结构是不规则的,有的组有两层,遇到这种情况应该如何处理? 注意到下面的这个需求 ...
- Spring4.2 集成ActiveMQ5.14
1:libs 2:web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...