3、HelloKhala示例说明
最简单的dome程序只需3行代码
1 int main() { 2 3 //设置端口号 4 5 InetAddress listenAddr(USER_PORT); 6 7 //将端口号绑定到Server 8 9 NodeServer nodeServer(listenAddr); 10 11 //设置连接线程数,并开启服务 12 13 nodeServer.start(USER_SERVER_THREAD_NUM); 14 15 return 0; 16 17 }
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。
1 int main() { 2 3 //设置端口号 4 5 InetAddress listenAddr(USER_PORT); 6 7 //将端口号绑定到Server 8 9 NodeServer nodeServer(listenAddr); 10 11 //设置临时连接最大空闲时间为60s 12 13 nodeServer.setTempNodeIdleTime(60); 14 15 //设置连接线程数,并开启服务 16 17 nodeServer.start(USER_SERVER_THREAD_NUM); 18 19 return 0; 20 21 }
系统日志显示,服务端在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不能由用户完全重写消息事件,但是系统为这两个消息事件提供了较多和登录生命周期相关的接口,用户可以选择对这些接口进行重写以达到自己的实际需求。