使用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服务器,每 ...
随机推荐
- 通过fsharp 使用Enterprise Library Unity 2
接着Depandency Injection继续. 最想做的还是用现成的程序模块对程序进行行为注入.只是不急,在此之前自己写一个接口对象观察一下IInterceptionBehavior接口的功效. ...
- CareerCup Facebook Total number of substring palindrome
Write a function for retrieving the total number of substring palindromes. For example the input is ...
- Angularjs 中的 controller
接触过程序开发的小伙伴们对 MVC 的开发方式想必一点也不陌生,是的, angularjs 所採用的方式便是 MVVM 的开发方式,这里的 controller 即控制器 了解 controller ...
- Linux下使用Nohup后台运行程序
一.不输出日志的命令 #!/bin/bash echo "starting nohup..." nohup dotnet ./mynetcoreapp.dll > /dev/ ...
- PYTHON如何降级?
到/usr/bin里面ls -l python*看看里面有多个版本的,把python2.6链接到python就可以了1.先把原来的删掉 rm python2.ln -s /usr/bin/python ...
- Maven项目同时使用lib下的Jar包
测试于:Maven 3.0.5, eclipse-jee-indigo-SR2-win32 配置步骤: 在WEB-INF下新建lib目录并加入自己的包: 右键项目 -> Build Path - ...
- linux CPU占用率高(转)
来自:http://www.cnitblog.com/houcy/archive/2012/11/28/86801.html 1.用top命令查看哪个进程占用CPU高 gateway网关进程14094 ...
- html中文显示乱码的处理方法
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 1. ht ...
- SpringBoot2中配置文件的调整,升级SpringBoot2时候注意的坑
原来使用SpringBoot1.5最近写个demo后发现原来的配置文件不能用了. 最后上网查询了一下资料,springboot2.0和spring1.x还是存在不少问题的. 1.问题一:Java版本要 ...
- JDBC编程之事务的使用教程
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5868750.html 关于事务的理论知识.ACID特性等等,网上太多了,在此不一一重复.本文主要着重 事务 ...