1、发布C++实现的TCP网络框架Khala
1、Khala简介
Khala(卡拉)是用C++实现的TCP网络框架。底层采用muduo网络库作为网络IO+线程模型,并封装实现了网络实现与业务逻辑分离的多线程网络框架,具有超时退出、多设备多事件注册支持、设备生命周期管理、设备间通信等功能。
项目托管地址:https://github.com/moyangvip/khala
2、底层支持
Khala底层采用muduo作为网络IO支持。muduo类似于市面上一些常用开源event-driven网络库(如libevent),实现了基于Reactor模式的非阻塞IO 机制,线程部分采用 one loop per thread + thread pool 模型。muduo源码:https://github.com/chenshuo/muduo。关于muduo更多的介绍可参见陈硕的《Linux多线程服务端编程》一书。
3、设备继承
用户在使用Khala框架时,无需关心底层网络IO及多线程模型的实现,只需为具体设备定制业务逻辑所需的消息响应事件。同时用户定义的设备支持多级继承。比如可以定制一类设备叫"灯设备",并为"灯设备"定制"开关"事件。然后可以定制一类新的设备叫"智能灯",并继承"灯设备"和定制"光照强度检测"事件,则"智能灯"将不但拥有"光照强度检测"的响应事件,还具有"灯设备"能够支持的所有响应事件。通过这种机制能够很好的实现不同设备的多级继承体系。

Khala框架组成的多级设备继承图,下一级设备类型在注册自己的消息响应事件的同时,也将继承支持上一级设备类型支持的全部消息响应事件,同时还能对上一级设备类型实现的某些消息响应事件进行重新实现。
4、设备生命周期
Khala默认实现的设备类型分为两类,即临时设备类型和登录设备类型。临时设备类型里面可以提供一些基础的对所有设备的通用消息响应事件,比如查询当前设备类型、查询系统当前时间等。用户同样可以在此注册符合自己业务需求的通用的消息响应事件。
同时Khala提供了登录管理设备类型。在登录管理设备类型中,Khala提供了设备的生命周期管理。

在设备生命周期中,Khala提供了相关的接口给用户,用于实现在不同时期进行不同操作和制定相关消息响应。
为了防止某些非法连接长期与服务端建立连接,占用系统资源,Khala支持超时检测退出机制。用户可以设置最大连接时间,一个连接在该时间段内未发送有效事件消息,将被强制断开连接。目前超时机制两类,临时连接超时检测和已登录设备超时检测,可以分别对其进行设置。
最后Khala还提供了设备管理支持,用户能够通过相关接口查询相关连接信息和登录设备信息。并实现在不同设备间进行消息通信功能。
5、适用场景
局域网内基于tcp长连接的设备管理,多设备间通信等。手机APP服务端设计。同时对于最常见的聊天室等功能,Khala也只需用户编写极少数代码即可实现。
6、关于Khala
Khala来源于StarCraft,是StarCraft中Protoss信仰的一种宗教。同时它也是Protoss间的精神网,能够对每一个连接了Khala的Protoss提供精神连接。
Khala框架最开始起源于我对某个智能家居项目的思考。在学习了陈硕的muduo网络库后之后,我产生了基于该网络库进行进一步封装的想法,并一个人用三周时间完成了这个开源框架的设计和大致代码实现。在之前并没有太多C++相关的项目经历,对于服务端编程的经验也仅学习自《UNP卷一》和陈硕介绍muduo相关的《Linux多线程服务端编程》,本质上是一款供学习交流类型的代码。设计出于个人的思考理解,代码写得也不好看,估计还有很多bug,功能也不完善。待日后慢慢学习慢慢改吧。
希望自己能够每周发布1-2篇相关的学习文档。 也希望对这方面有经验的同学能够多多拍砖,或者对这方面有兴趣的加入我一起学习一起交流。
学习文档将在http://www.cnblogs.com/moyangvip/category/767591.html进行发布。
7、参考书目
W.Richard Stevens:《UNIX网络编程 卷一》
陈硕:《Linux多线程服务端编程》
1、发布C++实现的TCP网络框架Khala的更多相关文章
- [apue] 一个工业级、跨平台的 tcp 网络服务框架:gevent
作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力. 与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是跑在 ...
- 一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent
前言 作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力.与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是 ...
- HTTP(S)网络框架的设计
0.麻烦 操作系统提供的网络接口都会令人不爽,要么太接近底层而使用不便,要么层次过高又不提供底层点的接口供设置参数.但是我们不能期望系统API做得很高级,因为没有绝对合适的网络库,必须定制化从而达到适 ...
- Android网络框架OkHttp之get请求(源码初识)
概括 OkHttp现在很火呀.于是上个星期就一直在学习OkHttp框架,虽然说起来已经有点晚上手了,貌似是2013年就推出了.但是现在它版本更加稳定了呀.这不,说着说着,OkHttp3.3版本在这几天 ...
- 【机翻】RTnet – 灵活的硬实时网络框架
目录 RTnet – 灵活的硬实时网络框架 0 摘要 1 介绍 2 基础服务 2.1 数据包管理 2.2 UDP/IP 实现 2.3 Driver Layer 2.4 应用程序接口 2.5 捕获扩展 ...
- 事件驱动之Twsited异步网络框架
在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...
- GJM : Unity3D 常用网络框架与实战解析 【笔记】
Unity常用网络框架与实战解析 1.Http协议 Http协议 存在TCP 之上 有时候 TLS\SSL 之上 默认端口80 https 默认端口 ...
- Android网络框架源码分析一---Volley
转载自 http://www.jianshu.com/p/9e17727f31a1?utm_campaign=maleskine&utm_content=note&utm_medium ...
- 【从0到1】android网络框架的选型参考
项目会使用到 socket tcp 级的网络访问,想选取一个使用较成熟异步网络框架, 提到的网络框架: 1. volley, 2. xutils. 3. android 4. netty, 5. mi ...
随机推荐
- JavaScript学习笔记(三十八) 复制属性继承
复制属性继承(Inheritance by Copying Properties) 让我们看一下另一个继承模式—复制属性继承(inheritance by copying properties).在这 ...
- Intellij idea配置springMvc4.2.6
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面. 环境: Intellij iead 2016.1 java version " ...
- Sql Server批量停止作业
CREATE Proc [dbo].[Proc_StopJob] as begin declare @I int declare @JobID uniqueidentifier -- 1. creat ...
- 层次查询start with ... connect by
如:select distinct dep_id from t_sys_dep_dimensions start with dep_id = (select dept_id from t_sys_pe ...
- php json_decode 后,数字对象转换成了 科学计数法 的解决方案
php json_decode 后,数字对象转换成了 科学计数法 $obj='{"order_id":213477815351175,"buyer":10000 ...
- 关于python27 中文编码
本博文已移致独立博客:www.pubwin2009.net 传送门:http://www.pubwin2009.net/index.php/pubwin/42.html 看了网上好多的资料,以前一直不 ...
- 关于lambda表达式树
总而言之: 就是在表达式中没有花括号. IEnumerable<Rect> rectlist3 = rectlist.Select(rect =>newRect(rect.X + 2 ...
- VC维
vc理论(Vapnik–Chervonenkis theory )是由 Vladimir Vapnik 和 Alexey Chervonenkis发明的.该理论试图从统计学的角度解释学习的过程.而VC ...
- Map的三种遍历
import java.util.*;/*** Map的三种遍历方式* @author Administrator**/public class m {public static void main( ...
- CH Round #53 -GCD Path
描述 给定一张N个点的有向图,点i到点j有一条长度为 i/(gcd(i,j))的边.有Q个询问,每个询问包含两个数x和y,求x到y的最短距离. 输入格式 第一行包含两个用空格隔开的整数,N和Q. 接下 ...