最简单的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. 1、发布C++实现的TCP网络框架Khala

    1.Khala简介 Khala(卡拉)是用C++实现的TCP网络框架.底层采用muduo网络库作为网络IO+线程模型,并封装实现了网络实现与业务逻辑分离的多线程网络框架,具有超时退出.多设备多事件注册 ...

  2. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  3. .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1

    微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...

  4. 通过Jexus 部署 dotnetcore版本MusicStore 示例程序

    ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...

  5. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  6. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  7. XAMARIN ANDROID 二维码扫描示例

    现在二维码的应用越来越普及,二维码扫描也成为手机应用程序的必备功能了.本文将基于 Xamarin.Android 平台使用 ZXing.Net.Mobile  做一个简单的 Android 条码扫描示 ...

  8. iOS之ProtocolBuffer搭建和示例demo

    这次搭建iOS的ProtocolBuffer编译器和把*.proto源文件编译成*.pbobjc.h 和 *.pbobjc.m文件时,碰到不少问题! 搭建pb编译器到时没有什么问题,只是在把*.pro ...

  9. Android种使用Notification实现通知管理以及自定义通知栏(Notification示例四)

    示例一:实现通知栏管理 当针对相同类型的事件多次发出通知,作为开发者,应该避免使用全新的通知,这时就应该考虑更新之前通知栏的一些值来达到提醒用户的目的.例如我们手机的短信系统,当不断有新消息传来时,我 ...

随机推荐

  1. [转]XML中必须进行转义的字符

    转自:http://jaenson.iteye.com/blog/945469 编写XML代码经常遗漏的常识: XML实体中不允许出现"&","<" ...

  2. PYTHON简介及安装

    Python简介 Python是一种广泛使用的高层次,通用,解释,动态编程语言.它的设计理念强调代码的可读性,它的语法允许程序员表达更少的代码的概念比将在可能语言如C ++或Java.该语言提供旨在使 ...

  3. HTML&CSS基础学习笔记1.13—无序列表

    无序列表 有时我们的工作繁忙,杂事很多,怕忘记,就会把事情一件件列出来,防止忘记. 它们的排列顺序对于我们来说并不重要,可以随意调换,我们将它称为无序列表,HTML里用<ul>标签来表示无 ...

  4. RF学习过程中遇到的问题

    1.写了一个打开浏览器的用例,执行用例时报需要对应的浏览器驱动,此时应下载对应的浏览器驱动,把该执行文件放到python的安装根目录下,再执行用例就成功了 2.日志不见的问题:需要杀进程

  5. 修改Activity的继承类导致程序闪退

    今天对老项目重构,重新写了BaseActivity.其中有一处改动是把原来的父类Activity改成了AppCompatActivity. 这一处的改动导致了程序在启动的时候直接闪退. 查看log输出 ...

  6. cf C. Matrix

    http://codeforces.com/contest/365/problem/C 构造出的矩阵中的长方形的和等于构成它的长的那些数字的和加上构成它的宽的那些数字的和. 也就是求这个字符串中的两个 ...

  7. 前端模拟发送数据-Chrome下的REST Client

    1)确定需要POST的数据 2)拼接数据,POST给服务器 3)查看服务器响应及结果

  8. logstash tomcat catalina.out zabbix 插件不会引起崩溃

    input { file { type => "zj_api" path => ["/data01/applog_backup/zjzc_log/zj-api ...

  9. BZOJ2212: [Poi2011]Tree Rotations

    2212: [Poi2011]Tree Rotations Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 391  Solved: 127[Submi ...

  10. 【转】Ubuntu 修改hosts

    原文网址:http://l.14551.org/2009/12/2166 Ubuntu系统的Hosts只需修改/etc/hosts文件,在目录中还有一个hosts.conf文件,刚开始还以为只需要修改 ...