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 ...
随机推荐
- Go语言之异常处理
在编写Go语言代码的时候,我们应该习惯使用error类型值来表明非正常的状态.作为惯用法,在Go语言标准库代码包中的很多函数和方法也会以返回error类型值来表明错误状态及其详细信息. error是一 ...
- 转载:mysql-Auto_increment值修改
转载网址:http://libo93122.blog.163.com/blog/static/1221893820125282158745/ | 2012-03-13 11:19:10 | 2012- ...
- 解决APP中fragment重叠问题
由于内存重启,导致的frgament重叠,其原因就是FragmentState没有保存Fragment的显示状态,即mHidden,导致页面重启后,该值为默认的false,即show状态,所以导致了F ...
- PHP内置Web Server探究(二)自定义PHP控制台输出console函数
我们在开发APP的服务器端,当和APP进行联调时通常需要实时跟踪URL请求和参数的接收情况. 但PHP并没有像Python或Java专有的控制台输出函数,Python的print()和Java的Sys ...
- 批处理更新svn
很多软件都有命令行支持,即可以直接在Windows命令提示符下输入软件提供命令来执行,完成软件的一些功能. 比如输入svn help 可以查看svn支持的命令行 想要更新svn资源需要用到命令svn ...
- 布局共享(列如所有activity拥有相同的布局部分,比如actionbar,在BaseActivity中写入布局)
有时候界面上会用到统一的布局,比如toolbar,你可能会想到在用到的地方都去加上toobar这样对于程序的开发与维护来说都显得特别麻烦,我们可以将他写在父类中. 首先创建一个BaseActivity ...
- 外部函数接口 LibFFI
“FFI” 的全名是 Foreign Function Interface,通常指的是允许以一种语言编写的代码调用另一种语言的代码.而 “Libffi” 库只提供了最底层的.与架构相关的.完整的”FF ...
- 运用Swagger 添加WebAPI 文档
1. Go to Web link https://www.nuget.org/packages/Swashbuckle/ and check which version do we want. 2. ...
- Linux的capability深入分析(1)
一)概述: 1)从2.1版开始,Linux内核有了能力(capability)的概念,即它打破了UNIX/LINUX操作系统中超级用户/普通用户的概念,由普通用户也可以做只有超级用户可以完成的 ...
- Android ToggleButton使用介绍
ToggleButton,就是开关按钮,包括选中和未选中状态,并且需要为不同的状态设置不同的事件处理: 例如:使用图片来展示ToggleButton不同的状态: MainActivity.java p ...