在网游服务器中客户端与服务器的通信是非常频繁的,客户端发过来的每一个消息(假设为proto消息),服务器收到后都可能要做相应的处理并且调用相应的函数(先到网关再转发到对应的服务器)。那么怎么样定义这一行为或者说怎么样来抽象这种行为,并且具有良好的可扩展性。比如对于好友消息的管理,有请求添加好友消息、删除好友消息等一系列消息。
#define reg_friend_cmd(cmd_type) \
ProtoCmdHandler::user_cmd_dispatcher.cmd_reg<Friend::cmd_type>(bind(&FriendCmdHandle::on_##cmd_type, this, _1, _2));
class FriendCmdHandle
{
public:
void init()
{
reg_friend_cmd(add_friend);
reg_friend_cmd(del_friend);
...
}
bool on_add_friend(..., Friend::add_friend);
bool on_del_friend(..., Friend::del_friend);
...
};
上述示意代码中Friend是个proto包名,其中消息注册部分reg_friend_cmd和之前的文章提到的函数注册类似,但是消息注册更为复杂,它把消息处理函数on_×××传给了ProtoCmdHandler,然后在ProtoCmdHandler类中又做了很多处理,但是原理和函数注册差不多,都是使用了一个map把消息处理函数存起来,如果客户端发过来一个消息,就根据这个消息的类型去查看这个map,找到了便执行相关处理函数。