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 ...
随机推荐
- poj3685 二分套二分
F - 二分二分 Crawling in process... Crawling failed Time Limit:6000MS Memory Limit:65536KB 64bit ...
- ECMAscript v.s. Javascript
ECMAscript是一种中性的语言,中性表示与所处环境(宿主环境)无关(客户端/服务器/浏览器),它仅仅是一个纯粹意义上的语言. ECMAscript-262定义了这门语言的基础,或者说规则(比如说 ...
- 针对AJAX与JSONP的异同
针对AJAX与JSONP的异同 1.ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架 ...
- 一个简单的redis调用类
能只能判断函数的调用规则,容错规则, 例如set函数 set($key, $value, $time = false) 根据time的真假来判断是否使用set,或者是setex函数 get函数 get ...
- C语言初学 数学中带根号的复杂计算问题
#include<stdio.h> #include<math.h> int main() { double a,b; scanf("%lf%lf",&am ...
- Scala学习笔记--Akka
待完成 http://www.gtan.com/akka_doc/ http://my.oschina.net/mingdong/blog/297972 http://www.jdon.com/con ...
- 如何在KEIL中编写模块化的C程序
在KEIL中的模块化程序写法在使用KEIL的时候,我们习惯上在一个.c的文件中把自己要写的东西按照自己思路的顺序进行顺序书写.这样是很普遍的写法,当程序比较短的时候比如几十行或者一百多行,是没有什么问 ...
- KEIL段协定
段名转换 Cx51编译器生成的目标代码(程序代码.程序数据和常数数据)保存在代码段或数据段中,一个段可以是可重定位的或绝对的,每个可重定位段有一个类型和一个名称.本节说明Cx51编译器命名这些段的惯例 ...
- coalesce和nvl函数
coalesce 函数 : Oracle COALESCE函数语法为COALESCE(表达式1,表达式2,...,表达式n),n>=2,此表达式的功能为返回第一个不为空的表达式,如果 都为空则返 ...
- js深入研究之克隆,属性,数组,对象,函数
代码 <script type="text/javascript"> /* 克隆原型得到对象 */ function clone(object) { function ...