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应用的更多相关文章

  1. 使用Beetle简单构建聊天室程序

    之前已经讲解了Beetle简单地构建网络通讯程序,那程序紧紧是讲述了如何发送和接收数据:这一章将更深入的使用Beetle的功能,主要包括消息制定,协议分析包括消息接管处理等常用的功能.为了更好的描述所 ...

  2. Beetle简单构建TCP服务

    使用Beetle构建TCP服务应用是件非常简单的事情,它并不需要你去关注Socket细节,如果你想用Socket编写高性能的TCP服务,那你要关注的东西非常多,异步数据处理,大量连接下的线程管理和连接 ...

  3. ActionScript简单实现Socket Tcp应用协议分析器

    转自..smark http://www.cnblogs.com/smark/archive/2012/05/15/2501507.html ActionScript简单实现Socket Tcp应用协 ...

  4. 【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施

    原文:[原创]构建高性能ASP.NET站点 第六章-性能瓶颈诊断与初步调优(下前篇)-简单的优化措施 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施 前言:本篇 ...

  5. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  6. 基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现

    设计概述 服务端通信组件的设计是一项非常严谨的工作,其中性能.伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性.可用 ...

  7. 构建高性能WEB站点笔记三

    构建高性能WEB站点笔记三 第10章 分布式缓存 10.1数据库的前端缓存区 文件系统内核缓冲区,位于物理内存的内核地址空间,除了使用O_DIRECT标记打开的文件以外,所有对磁盘文件的读写操作都要经 ...

  8. 构建高性能WEB站点笔记二

    构建高性能WEB站点笔记 因为是跳着看的,后面看到有提到啥epoll模型,那就补充下前面的知识. 第三章 服务器并发处理能力 3.2 CPU并发计算 进程 好处:cpu 时间的轮流使用.对CPU计算和 ...

  9. 构建高性能高并发Java系统 .

    转:http://blog.csdn.net/nengyu/article/details/7591854 场景这里指的高性能高并发服务器是一个有状态的服务,可以理解成web或者socket服务器,每 ...

随机推荐

  1. 解决excel日期变成数字的问题

    在Excel中如果单元格的公式是日期格式,那么引用后的数值是错误的[不是日期格式而被转换成数字类型了],这种情况显然不是我们想要的结果 解决办法: 在公式中强制转成文本类型即可(="Date ...

  2. eclipse help说明链接

    http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.cdt.doc.user%2Freference%2Fcdt_u_prop_bu ...

  3. Mysql写入中文出错

    本地调试好像正常,服务器运行报错: UnicodeEncodeError: 'latin-1' codec can't encode character u'\u5206' in position 2 ...

  4. win8下everything无法使用的解决方法

    今日我电脑上的Everything打开后都无法使用了,只显示几个分区,重装之后暂时就好了,重启电脑又坏了 解决方法:运行services.msc,启动everything.然后重启everything ...

  5. springboot微信sdk方式进行微信支付

    https://blog.csdn.net/xsg6509/article/details/80342744

  6. ERROR - Undefined placeholders found in template:

    今天发现了一个BUG,在引用其他的包的的时候报错: ERROR - Undefined placeholders found in template: - Template: META-INF/aut ...

  7. Qt 拖动窗口位置

    Qt 版本 4.8.1 ,主要是为了解决 embeded Qt 下,子窗口的拖动问题. void MyInputPanel::mousePressEvent(QMouseEvent *mouseEve ...

  8. Servlet简介与生命周期

    一:Servlet是什么 Servlet是运行在Web服务器上的Java程序,作为处理来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层.JSP在w ...

  9. 如何捕获 System.loadLibrary 产生的异常?(转)

    如何捕获 System.loadLibrary 产生的异常? 当使用以下代码时,会发现异常处理的代码根本不会被执行: try{ System.loadLibrary("SimpleAuthe ...

  10. java 八种基本数据类型之与对应的封装类之间的相互转化

      迁移时间--2017年5月26日17:47:37 Author:Marydon 一.java数据类型之基本数据类型 UpdateTime--2017年1月9日17:31:14 (三)格式转换 1. ...