3、HelloKhala示例说明
最简单的dome程序只需3行代码
int main() {
//设置端口号
InetAddress listenAddr(USER_PORT);
//将端口号绑定到Server
NodeServer nodeServer(listenAddr);
//设置连接线程数,并开启服务
nodeServer.start(USER_SERVER_THREAD_NUM);
return ;
}
NodeServer提供了如下接口:
void start(int usrIoThreadNum);
启动服务端,永不返回,参数为除主线程外的线程池数。若线程池数不为0,则主线程只负责accept监听服务,具体事务由线程池中线程处理;若线程池数为0,则均由主线程处理。
void setTempNodeIdleTime(int seconds);
设置一个临时连接最大的空闲时间,如果这段时间内未收到有效消息,该连接将被超时断开。如果设置为0,则不开启临时连接的超时检测,默认不开启。必须大于超时检测的最小单位CheckTime。
void setNodeIdleTime(int seconds);
设置一个登录连接的最大空闲时间,如果这段时间内未收到有效消息,该连接将被超时断开。如果设置为0,则不开启临时连接的超时检测,默认不开启。必须大于超时检测的最小单位CheckTime。
void setCheckTime(int seconds);
设置每次检测超时连接的时间,作为超时检测的最小单位。默认为10s。如果为0,则关闭超时检测,并将TempNodeIdleTime、NodeIdleTime置0。
bool addNodeType(NodeType* nodeType);
添加新的设备类型事件,详见 5、登录管理设备类型 + 创建新的设备类型。
void setTempNodeType(TempNodeType* tempNodeType);
重写临时设备类型事件,详见 4、临时设备类型消息事件。
1、线程数
我们设置连接线程数为4,并运行程序

此时可见Khala一共创建了5个线程,一个为主线程负责,另外4个为线程池线程。在线程模型中,主线程只负责accept监听服务,每当建立新的连接,就会按照轮询算法将新连接分配到线程池中的具体某个线程中进行处理。
如果我们设置连接线程数为0,则系统将不会创建线程池。监听服务和所有连接处理都将在主线程中进行处理。
2、连接超时
Khala通过setTempNodeIdleTime()和setNodeIdleTime()两个接口提供了连接超时检测,能够检测长期空闲的客户连接。如果连接长期没有发送有效消息,将被服务端强制断开连接。此处将临时连接设置为60s。
int main() {
//设置端口号
InetAddress listenAddr(USER_PORT);
//将端口号绑定到Server
NodeServer nodeServer(listenAddr);
//设置临时连接最大空闲时间为60s
nodeServer.setTempNodeIdleTime();
//设置连接线程数,并开启服务
nodeServer.start(USER_SERVER_THREAD_NUM);
return ;
}
系统日志显示,服务端在7分22秒时新建立一个临时连接。在一分钟时间里,服务端并没有再接收到该连接的有效消息,于是该连接在8分30秒时被系统判定超时,并强制断开连接。

3、默认消息事件
Khala目前默认提供了login(登录)、logout(登出)、devTpye(设备类型)、isLogin(登录状态)、nodeId(设备ID号)等事件机制。我们通过一个简单的客户程序(./example/testClient/HelloKhalaClient.py)对该服务端进行测试。

其中[send msg]是客户端发送给服务端的消息流,采用json消息格式(实际发送的消息流并不完全为显示的json内容,因为tcp传输是以流的方式进行,并没有明显边界,因此在每个消息前都加上了消息包头用于解决粘包问题)
4、临时设备类型和登录管理设备类型
在默认的设备继承体系中,Khala实现了临时设备和登录管理设备两种类型。其中在临时设备类型中注册的事件消息无需登录操作,任何连接都可以获得该类型的消息响应。而登录管理设备类型中注册的事件消息必须执行登录操作后,才能获取该类型的消息响应,否则返回未识别的消息类型。同时,如果某个设备处于登录类型,同样能够获取所有临时设备类型的中注册的事件消息。

在Khala默认实现中,login、devType、isLogin属于在临时设备类型中注册的实现消息,而logout、nodeId为在登录管理设备中注册的实现消息,因此必须先执行登录操作才能获取响应。
此处我们在未登录的情况下请求logout和nodeId,服务端响应错误的请求类型。如果我们执行login后再执行logout或nodeId请求,就能得到正确响应。

此处演示的默认实现的消息事件中,除了login、logout为系统保留消息事件,其它消息事件都可以由用户进行重写。用户也可以注册定制符合自己设备类型和业务逻辑需求的消息事件,这将在接下来的文档中进行介绍。
虽然login和logout不能由用户完全重写消息事件,但是系统为这两个消息事件提供了较多和登录生命周期相关的接口,用户可以选择对这些接口进行重写以达到自己的实际需求。
3、HelloKhala示例说明的更多相关文章
- 1、发布C++实现的TCP网络框架Khala
1.Khala简介 Khala(卡拉)是用C++实现的TCP网络框架.底层采用muduo网络库作为网络IO+线程模型,并封装实现了网络实现与业务逻辑分离的多线程网络框架,具有超时退出.多设备多事件注册 ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1
微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...
- XAMARIN ANDROID 二维码扫描示例
现在二维码的应用越来越普及,二维码扫描也成为手机应用程序的必备功能了.本文将基于 Xamarin.Android 平台使用 ZXing.Net.Mobile 做一个简单的 Android 条码扫描示 ...
- iOS之ProtocolBuffer搭建和示例demo
这次搭建iOS的ProtocolBuffer编译器和把*.proto源文件编译成*.pbobjc.h 和 *.pbobjc.m文件时,碰到不少问题! 搭建pb编译器到时没有什么问题,只是在把*.pro ...
- Android种使用Notification实现通知管理以及自定义通知栏(Notification示例四)
示例一:实现通知栏管理 当针对相同类型的事件多次发出通知,作为开发者,应该避免使用全新的通知,这时就应该考虑更新之前通知栏的一些值来达到提醒用户的目的.例如我们手机的短信系统,当不断有新消息传来时,我 ...
随机推荐
- 【转】char *str 和 char str[]的区别
char str[] = "abcd";定义了一个局部字符数组,返回它的地址肯定是一个已经释放了的空间的地址. 此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后 此 ...
- jQuery1.9(辅助函数)学习之—— jQuery.param( obj ); 编辑
jQuery.param( obj ); 返回一个String 描述: 创建一个数组或对象序列化的的字符串,适用于一个URL 地址查询字符串或Ajax请求. jQuery.param( obj ); ...
- Ajax实现三级联动(0520)
查询数据库中的chinastates表,通过父级代号查询相应省市区. 实现界面: 在js页面实现三级联动 在JQuery中调用Ajax方法(引用JQuery文件一定放在最上面) 用插件的形式,创建三个 ...
- DNS预获取(dns-prefetch)
今天翻看twitter的源码的时候看到了一下内容: <link rel=”dns-prefetch” href=”http://a0.twimg.com”/> <link rel=” ...
- new Handler()和new Handler(Looper.getMainLooper())的区别
一个帖子的整理: Handler一定要在主线程实例化吗?new Handler()和new Handler(Looper.getMainLooper())的区别如果你不带参数的实例化:Handler ...
- [转]IBInspectable / IBDesignable
原文:http://www.cocoachina.com/ios/20150227/11202.html 无论陈词滥调多少次,比起一个需要我们记住并且输入什么的界面来说,如果替换成我们能够看见并可控制 ...
- While reading XXX pngcrush caught libpng error: N
错误一: While reading /XXX/XXX/XXX/img1.png pngcrush caught libpng error: Not a PNG filCould not fi ...
- 关于NotePad++ v1.0的编译和源码分析
最近想读读开源项目,windows下的.文本编辑器是一个很好的选择,因为里面的很多技术,算法(字符串搜索,匹配等)都是被程序员实现过千万遍了,代码里面有很多精髓可以让我们这些菜鸟学学. 首先:下载源码 ...
- Android GridView用法介绍
GridView(网格视图)是按照行和列的方式来显示内容的,一般用于显示图片等内容,比如实现九宫格图: 第一个例子: 实现代码为: MainActivity.java package com.xiao ...
- HDU 4444 Walk (离散化建图+BFS+记忆化搜索) 绝对经典
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给你一些n个矩形,给你一个起点,一个终点,要你求从起点到终点最少需要转多少个弯 题解:因为 ...