3 创建服务项目
1、导出基类库
之前的服务框架是以可执行程序的方式实现的,现在需要导出lib库。
修改框架项目的CMakeLists.txt文件中的导出配置
#add_executable(SimpleService ${SRC_LIST})
add_library(ServiceBase STATIC ${SRC_LIST})编译文件,得到libServiceBase.a,放到lib文件夹。
将相应的头文件导出到include文件夹。
2、创建一个新项目
新创建一个项目,起名为ChatService,用来实现聊天服务项目。
首先编写整个服务的入口main.cpp
#include "ChatService.h"
int main(){
ChatService svr;
svr.Start();
return 0;
}入口是一个简单的main函数,包含ChatService.h头文件,函数主题创建了一个聊天服务,执行服务的Start() 方法,后面的工作就交给服务类了。
服务继承于基类NetService,并重写了两个基类函数CreateUser(int nOrigine)和OnTimeOut(time_t tNow)。
CreateUser函数根据数据来源,确认连接者身份,并生成对应的连接对象,在这里是ClientUser代表客户端连接对象。
在程序开发中,尽量使用命名常量替代具体的数字,这有两个好处:1是代码容易阅读理解,2是多处使用的时候,如果需要修改,只需修改定义赋值的地方。此处标识客户端来源定义的变量是ORIGINE_CLIENT,其定义放在了ChatProtocol.h中
当客户端发送消息到服务端时,服务端先根据客户端Header中的Origine属性,调用服务重写的CreateUser函数,得到对应的User对象。基类实现的具体流程参见 《第二章第二节 增加监听端口》一节的内容。
OnTimeOut函数提供了一个30秒的定时轮询,每隔30秒触发一次函数调用,用于服务常规的定时检测,ChatService中的实现为
另外,服务的构造函数中给一些变量进行赋值。首先给全局变量g_pService赋值,便于服务其他地方调用服务函数。m_nPort是继承自NetService的成员变量,赋值后服务将监听这个端口。
SetLogName函数设置了服务输出日志的文件名,如果不设置,默认输出到ServiceBase.log文件中。
以上便基于服务框架创建了一个新的服务,可以监听服务自定义的端口,输出日志到指定文件,每隔30秒定期执行一次函数回调。
下一节,我们介绍ClientUser的实现。
Last updated