最简单的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 }
我们设置连接线程数为4,并运行程序
此时可见Khala一共创建了5个线程,一个为主线程负责,另外4个为线程池线程。在线程模型中,主线程只负责accept监听服务,每当建立新的连接,就会按照轮询算法将新连接分配到线程池中的具体某个线程中进行处理。
如果我们设置连接线程数为0,则系统将不会创建线程池。监听服务和所有连接处理都将在主线程中进行处理。
Khala提供了连接超时检测,能够检测长期空闲的客户连接。如果一个未执行登录操作的客户连接长期没有发送有效消息,将被服务端强制断开连接。此处将其设置为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.setIdleTime(60); 14 15 //设置连接线程数,并开启服务 16 17 nodeServer.start(USER_SERVER_THREAD_NUM); 18 19 return 0; 20 21 }
系统日志显示,服务端在7分22秒时新建立一个连接。在一分钟时间里,服务端并没有再接收到该连接的有效消息,于是该连接在8分30秒时被系统判定超时,并强制断开连接。
Khala目前默认提供了login(登录)、logout(登出)、devTpye(设备类型)、isLogin(登录状态)、nodeId(设备ID号)等事件机制。我们通过一个简单的客户程序(./example/testClient/HelloKhalaClient.py)对该服务端进行测试。
其中[send msg]是客户端发送给服务端的消息流,采用json消息格式(实际发送的消息流并不完全为显示的json内容,因为tcp传输是以流的方式进行,并没有明显边界,因此在每个消息前都加上了消息包头用于解决粘包问题)
在默认的设备继承体系中,Khala实现了临时设备和登录管理设备两种类型。其中在临时设备类型中注册的事件消息无需登录操作,任何连接都可以获得该类型的消息响应。而登录管理设备类型中注册的事件消息必须执行登录操作后,才能获取该类型的消息响应,否则返回未识别的消息类型。
在Khala默认实现中,login、devType、isLogin属于在临时设备类型中注册的实现消息,而logout、nodeId为在登录管理设备中注册的实现消息,因此必须先执行登录操作才能获取响应。
此处我们在未登录的情况下请求logout和nodeId,服务端响应错误的请求类型。如果我们执行login后再执行logout或nodeId请求,就能得到正确响应。
此处演示的默认实现的消息事件中,除了login、logout为系统保留消息事件,其它消息事件都可以由用户进行重写。用户也可以注册定制符合自己设备类型和业务逻辑需求的消息事件,这将在接下来的文档中进行介绍。
虽然login和logout不能由用户完全重写消息事件,但是系统为这两个消息事件提供了较多和登录生命周期相关的接口,用户可以选择对这些接口进行重写以达到自己的实际需求。
原文:http://www.cnblogs.com/moyangvip/p/5050563.html