上一篇文章解析了游戏源码的结构,我们知道该源码包含两个服务器的启动脚本:网关服务器和游戏服务器,其中网关服务器用于在玩家选择进入游戏服务器之前获取服务器列表,游戏服务器则处理玩家进入游戏服务器后的登录,进入游戏操作。
先来说说游戏的网关服务器部分的启动过程,和网关服务器相关的代码为sd_gateway_xxx.erl。
运行script/gateway.sh文件,从sd:gateway_start/0部分启动名为gateway的应用,找到gateway.app中的{mod,{sd_gateway_app,[]}},进入sd_gateway_app:start/2,进行初始化数据库,启动sd_gateway_sup监控树的操作。
进入sd_gateway_sup,在监控树下挂两个进程:sd_gateway和mod_disperse,前者为网关的具体实现通过循环等待来自客户端的tcp连接,处理协议号为60000和60001的请求(具体协议内容可以查看doc/60网关协议.txt);后者为在有新的节点加入集群时进行通知,在游戏服务器部分也有应用,此处先不展开说明。
从sd_gateway:init/1进入,可以发现其调用了sd_gateway_server;start_raw_server/3方法,其代码如下:
start_raw_server(Port, Fun, Max) ->
Name = port_name(Port),
case whereis(Name) of
undefined ->
Self = self(),
Pid = spawn(fun() -> code_star