4、临时设备类型消息事件

  临时设备类型的默认消息事件在khala框架中由TempNodeType类实现。目前默认实现了login、devTpye、isLogin三个消息事件,这些消息事件无需设备进行登录操作,任何连接都可以获得该类型的消息响应。其中login涉及到登录生命周期管理,为保留事件,无法对其进行重写操作。其他消息事件都可以由用户根据实际业务需求进行重写,或添加新的临时设备类型消息事件。

1、重写临时设备类型消息

  我们可以通过重写Khala默认实现的临时设备类型消息来满足实际需求,下面以重写devTpye为例进行说明:

  devType消息事件是指获取当前连接的设备类型,如果为未登录设备则为temp_type,如果为已登录设备则为login_type,在已登录设备基础上还可以扩展更加具体的设备类型。在客户端测试中,在连接未登录状态下,也能获取devTpye、isLogin请求事件的响应。

  我们首先创建一个新的名叫MyTempNodeType的类,该类继承于TempNodeType类,并在该类中重写onDevTypeMsg这个方法。在新方法中,我们在send连接具体设备类型的同时,加上"this is my devType"这句,用于区分原devType的实现。

class MyTempNodeType: public khala::TempNodeType {
public:
    MyTempNodeType();
    virtual ~MyTempNodeType();
    //重写TempNodeType类的devType响应事件
    virtual bool onDevTypeMsg(khala::InfoNodePtr& infoNodePtr, Json::Value& msg,
            khala::Timestamp time) {
        std::string devType = infoNodePtr->getNodeType();
        infoNodePtr->send("this is my devType:" + devType);
        return true;
    }
};

  同时在main函数中,我们通过nodeServer.setTempNodeTypeInstance(&myTempNodeType)向系统注册我们新创建的MyTempNodeType类。

int main() {
    InetAddress listenAddr(USER_PORT);
    NodeServer nodeServer(listenAddr);
    //创建MyTempNodeType对象
    MyTempNodeType myTempNodeType;
    //将该对象注册为新的TempNodeType
    nodeServer.setTempNodeTypeInstance(&myTempNodeType);
    nodeServer.start(USER_SERVER_THREAD_NUM);
    return 0;
}

  

  只需以上两个简单的步骤,我们就很方便的完成了对devTpye的临时设备类型消息响应事件的重写。此时我们可以运行新的服务端程序,同时启动客户端进行测试:

2、创建新的临时设备类型消息

  显然默认的两个临时设备类型消息是无法满足我们对于服务端系统的要求的,khala框架同样提供了创建新的非登录消息响应事件的途径。下面通过创建一个获取当前系统时间的临时设备类型消息。

  首先必须为这个事件设置一个消息类型,可以在./include/khala/ParseKey.h中添加TIME_TYPE。新添加的消息类型必须为唯一设置的字符串。

//this is default msg type
#define LOGIN_TYPE "login"
#define LOGOUT_TYPE "logout"
#define DEV_TYPE "dev"
#define IS_LOGIN_TYPE "isLogin"
#define NODE_ID_TYPE "nodeId"

//this is my msg type
#define TIME_TYPE "time"

  依旧基于之前创建的新类MyTempNodeType,我们在这个类中新建方法onTimeMsg,在该方法中,我们实现获取时间的消息响应事件。

class MyTempNodeType: public khala::TempNodeType {
public:
    MyTempNodeType();
    virtual ~MyTempNodeType();  //重写TempNodeType的devType响应事件   
    virtual bool onDevTypeMsg(khala::InfoNodePtr& infoNodePtr, Json::Value& msg,
            khala::Timestamp time) {
        std::string devType = infoNodePtr->getNodeType();
        infoNodePtr->send("this is my devType:" + devType);
        return true;
    }  //新建time响应事件
    virtual bool onTimeMsg(khala::InfoNodePtr& infoNodePtr, Json::Value& msg,
            khala::Timestamp time){
        std::string timeStr = khala::Timestamp::now().toFormattedString();
        infoNodePtr->send("curr time:" + timeStr);
        return true;
    }  //消息注册方法
    virtual void setRegisterMsg(khala::RegisterHandler& handler){     //调用父类的setRegisterMsg方法
        khala::TempNodeType::setRegisterMsg(handler);     //注册time响应事件
        handler.setRegisterMsg(TIME_TYPE,boost::bind(&MyTempNodeType::onTimeMsg, this, _1, _2, _3));
    }
};

  此时虽然我们实现了获取时间的新建方法onTimeMsg(),但是系统并不知道这个方法的存在,此时需要接着重写消息注册方法setRegisterMsg(),并在该方法中完成对新创建的onTimeMsg方法的注册。

  在重写setRegisterMsg方法完成注册前,必须显示调用父类的setRegisterMsg方法,否则将会丢失父类注册的消息响应事件,即无法识别原TempNodeType类默认实现的login、devTpye、isLogin等消息事件。

  最后同样在main函数中通过nodeServer.setTempNodeTypeInstance(&myTempNodeType)向系统注册我们新创建的MyTempNodeType类。

  这时我们已经创建了新的临时设备类型消息事件time。我们运行新的服务端程序,同时启动添加了time事件的客户端程序(./example/testClient/HelloKhalaClient2.py)进行测试:

  此时我们在未登录的情况下,通过time消息事件获得了系统时间。

  同时我们注意到虽然我们重写了TempNodeType类,但此时原TempNodeType默认实现的isLogin消息事件依旧能够被我们请求响应。如果有兴趣的话,可以尝试重写setRegisterMsg方法时,不显示调用父类的setRegisterMsg()方法,会发生什么?

  我们可以继续在登录后请求time消息事件,此时依旧能够获得系统时间。我们新创建的time消息事件是跟登录无关的,任何连接都可以请求此消息响应,符合我们之前对临时设备类型消息的定义。

时间: 2024-10-16 01:28:08

4、临时设备类型消息事件的相关文章

C++服务器设计(五):多设备类型及消息事件管理

在传统的服务器系统中,服务器仅针对接收到的客户端消息进行解析,并处理后回复响应.在该过程中服务器并不会主动判断客户端类型.但在现实中,往往存在多种类型的客户端设备,比如物联网下的智能家居系统,就存在智能电视.智能灯具.智能空调等,甚至一类客户端也可区分为网页端设备和移动端设备.不同类型的设备的消息处理机制不同,同一类型的网页端和移动端的消息处理也可能存在些许差别.此时服务器就需要对多种类型的设备进行管理. 设备类型机制及消息事件设计 一般而言,服务器检测客户端类型,存在两种方法: l  为不同类

Unity中消息事件的封装与运用

大家在开发Unity的时候,为了方便开发一般都会采用消息事件,消息事件主要是做啥的?我们如何去封装,如何去运用消息事件处理事情.接下来就给大家介绍一下: 消息事件顾名思义,是通过消息触发的事件.比如大家去完成某个任务,完成后才会触发另一个事件的发生,这种情况我们就会使用消息事件等等吧. 消息事件的使用主要是通过添加消息监听,然后分发消息处理事情. 那我们如何去封装我们的消息系统,在这里我把代码给大家分享一下: 首先我们定义一个消息枚举类型脚本CEventType.cs内容如下: 接下来封装消息事

微信小程序监听WebSocket消息事件wx.onSocketMessage(CALLBACK)

微信小程序WebSocket消息wx.onSocketMessage(CALLBACK) wx.onSocketMessage(CALLBACK) ? 监听WebSocket接受到服务器的消息事件 CALLBACK返回参数: 参数 类型 说明 data String 服务器返回的消息 示例代码: wx.connectSocket({ url:"qkxue.net" }); wx.onSocketMessage(function(res){ console.log("收到服务器

在MFC中增加一个时间计时器消息事件

在MFC中增加一个时间计时器消息事件 利用this->SetTimer(1,1000,NULL);开启计时器 添加响应事件 void Csqllink1Dlg::OnTimer(UINT_PTR nIDEvent) { CTime tm; tm=CTime::GetCurrentTime(); CWnd* pWnd = (CWnd*)GetDlgItem(IDC_STATIC);switch(nIDEvent){ case 1: //MessageBox(_T("test"));

java微信二次第三方开发,token认证,消息事件接收,图文素材库,自定义菜单等功能

基于之前的文章SSM配置的项目:http://www.cnblogs.com/mangyang/p/5168291.html 来进行微信第三方开发, 微信二次开发,官方还是网上有很多介绍了,这里就不在进行讲述了 直接上干货. 首先 与微信对接,服务器配置,需要80端口和443端口开放的服务器,这里推荐 使用 python 的pagekite,一款反向代理的工具,具体安装百度搜,提供下配置放方法:http://jingyan.baidu.com/article/0eb457e52ca0af03f0

IOS Android:消息事件通知 NSNotificationCenter EventBus

文章来自:http://blog.csdn.net/intbird IOS IOS系统自带 NSNotificationCenter 0,上图 1,初始化程序入口 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { MainViewController* mainView = [[MainViewController alloc

Qt自己定义事件实现及子线程向主线程传送事件消息

近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就不打算陈述一大堆理论啦,只是,还是建议大家去查查对应的理论比較好.这样能对Qt的消息传送机制的理解更加深入. 依据网上大多数人的资料,要实现自己定义消息,须要从QEvent 派生一个自己定义的事件:事实上也能够不须要,仅仅要使用QEvent::Type自己定义一个事件即可了. 在这里,本人把两种实现

Atitit.事件机制 与 消息机制的联系与区别

1. 消息/事件机制是几乎所有开发语言都有的机制,在某些语言称之为消息(Event),有些地方称之为(Message).1 2. 发布/订阅模式1 3. 事件是侵入式设计,霸占你的主循环:消息是非侵入式设计,将主循环该怎样设计的自由留给用户.1 3.1. 事件越如 框架,消息相像类库2 3.2. 事件比消息封装的更高一层2 4. 消息队列和事件触发的区别,本质是没啥区别的2 5. 事件机制与消息机制2 1. 消息/事件机制是几乎所有开发语言都有的机制,在某些语言称之为消息(Event),有些地方

事件和消息机制的理解

消息/事件机制是几乎所有开发语言都有的机制,并不是deviceone的独创,在某些语言称之为消息(Event),有些地方称之为(Message). 其实原理是类似的,只不过有些实现的方式要复杂一点.我们deviceone统一就叫消息. 消息基础概念 还有一些初学者不太熟悉这个机制,我们先简单介绍一些基础概念,如果熟悉的人可以跳过这个部分.一个/条消息可以理解为是一个数据结构,包含以下几个基本部分: 消息源 :就是消息的来源,发出这个消息的对象 消息名 :就是消息的唯一标示 消息数据:消息发出后附