游戏服务器中的进程就是前文游戏服务器架构中所述的各类服务器进程了,这类进程一般采用单例设计模式,里面会包含一个main函数,是进程主程序的入口。在main函数中会做一些初始化操作,比如初始化日志,初始化一些全局参数等,然后再去执行init函数,主要的初始化工作其实会在这个init函数中执行。游戏服务器进程各个类设计继承层次比较多,一种设计方案如下所示:
class Service
{
public:
static Service *instance() {
return _instance;
}
void main();
void end() { //结束主回调函数,即终止服务器进程
_end = true;
}
bool is_end() { //用于判断主回调函数是否结束
return _end;
}
virtual ~Service() {
_instance = NULL;
}
protected:
Service(const string &name) : _name(name) {
_instance = this;
_end = false;
}
virtual bool init();
virtual bool callback() = 0; //服务器进程的主回调函数,用于监听服务端口,false:结束进程,true:继续服务
virtual void final() = 0; //结束服务器进程,主要用于回收资源
private:
static Service *_instance;
string _name; //服务器进程名称
bool _end; //服务器进程结束标记
};
Service *Service::_instance = NULL;
Service这个类是所有服务器进程相关类的基类,所有服务器进程实体都需要继承这个类,并且继承这个类的子类也要使用单例模式。
class NetService : public Service
{
public:
virtual void new_tcp_task(); //根据accept得到的tcp/ip连接获取一个连接任务
virtual const int get_pool_size() const {return 0;} //连接池大小
virtual const int get_pool_state() const {return 0;} //连接池状态
virtual ~NetService() {
_instance = NULL;
}
protected:
Service(const string &name) : Service(name) {
_net_instance = this;
_net_name = name;
_tcp_server = NULL;
}
bool init();
bool callback();
void final();
private:
static NetService *_net_instance;
string _net_name; //服务器进程名称
TcpServer *_tcp_server;//TcpServer类主要封装了服务器监听模块,用于创建一个服务器对象,等待客户端的连接
};
NetService *NetService::_net_instance = NULL;
NetService这个类主要用于侦听连接的。
class SubNetService : public NetService
{
public:
static SubNetService *SubNetServiceInstance() {
return _sub_net_instance ;
}
virtual ~SubNetService () {
_sub_net_instance = NULL;
}
vitual bool parse_super_cmd() = 0;
bool send_cmd_to_super_cmd();
const int get_server_id() const { //服务器编号
return _server_id;
}
const int get_server_type() const { //服务器类型
return _server_type;
}
protected:
SubNetService(const string &name, int type) : _name(name),_server_type(type) {
_sub_net_instance = this;
}
bool init();
void final();
int _server_id;
int _server_type;
char _str_name[100];
char _str_ip[100]; //内网地址
int _port; //内网端口
int _ext_str_ip[100]; //外网地址
int _ext_port; //外网端口
private:
static SubNetService *_sub_net_instance ;
int _super_port; //服务器管理器端口
char _super_ip[100]; //服务器管理器地址
SuperClient *_super_client; //服务器管理器客户端实例
};
SubNetService *SubNetService ::_sub_net_instance = NULL;
这个类主要用于与服务器管理器之间建立连接。
class ProcessService : public SubNetService //ProcessService代表各类服务器进程
{
public:
static ProcessService &ProcessServiceInstance() {
if (NULL == _process_instance)
_process_instance = new ProcessService();
return *_process_instance ;
}
virtual ~ProcessService () {
_process_instance = NULL;
}
vitual bool parse_super_cmd() = 0;
bool send_cmd_to_super_cmd();
//各类指向数据库连接池实例的指针
...
private:
static ProcessService *_process_instance ;
TcpTaskPool *_task_pool; //tcp连接池
bool init();
void final();
void new_tcp_task();
ProcessService () : SubNetService("各类服务器进程", TYPE) {
_task_pool= NULL;
}
};
ProcessService *ProcessService ::_process_instance = NULL;
这个类就是文章一开始所述的游戏服务器了,它往上继承层次有3层。