最简单的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. 第1章 网络编程基础(3)——基本Socket通信

    服务器常用模型

  2. 【转】c/c++各种字符、字符串类型转换

    itoa   功 能:把一整数转换为字符串   用 法:char *itoa(int value, char *string, int radix);   详细解释:itoa是英文integer to ...

  3. C++程序设计的技巧-Pimple的使用

    1.Pimpl概念 在进行项目开发中可能遇到的问题,程序编译耗时很长,每一次简单修改接口之后项目都会被完全重新编译,浪费了很多时间.这个机制是Private Implementation的缩写,顾明思 ...

  4. uva 11038 - How Many O's?

    想法: 將問題簡化為求1~m 0的總數,以及1~n 0的總數,然後最後再相減. 求1~n 0的總數,要將n分別算每個位數0的個數,舉例如30324: 先從右邊第一位'4'開始,其左邊為3032,表示1 ...

  5. Google Guava的splitter用法

    google的guava库是个很不错的工具库,这次来学习其spliiter的用法,它是一个专门用来 分隔字符串的工具类,其中有四种用法,分别来小结 1 基本用法: String str = " ...

  6. php打印xml格式数据

    在你要输出的xml前边加       header("Content-type:text/xml;charset=utf-8"); 这个上边不要有任何输出 打印用echo 别用va ...

  7. Visual studio 内存不足的解决方案(out of memory)

    编译Visual Studio项目,如果出现"out of memory "的编译错误,可以进行如下操作,加大应用程序可以使用的内存. 请先备份好系统和设置好系统还原点,大体步骤是 ...

  8. DataTables自定义筛选器

    /* Custom filtering function which will search data in column four between two values */ $.fn.dataTa ...

  9. github进行修改

    1)git status:可以让我们时刻掌握仓库当前的状态. 2)git diff [文件名]:查看改变的详细信息,显示的结果是Unix通用的diff格式. 步骤: 1.修改文件 2.通过git ad ...

  10. Codeforces 4D Mysterious Present

    http://codeforces.com/contest/4/problem/D 题目大意: 给出n个信封,这n个信封有长和宽,给出卡片的尺寸,求取能够装入卡片的最长的序列,序列满足后一个的长和宽一 ...