在《网络游戏服务器架构》这篇文章中,我描述了我们游戏中的服务器基本结构。游戏中4大服务器session, gateway, dbx, world,它们之间通过sock进行通信。四大服务器的连接过程是这样的:
1.先启动dbx,dbx监听端口3000,供其他服务器连接
2.接下来是session,它连接dbx(3000),同时监听2300,供gateway连接,并且监听2500,供world连接
3.然后是gateway,它连接session(2300),监听2200,供world连接,同时监听2100,供client连接
4.最后是world,它连接以上所有服务器,dbx(3000),session(2500),gateway(2200)
以下是连接关系图示,A->B表示A主动连B。(图片是手稿,在手机里,晚上再传0.0)
4个服务器进程启动后,除了world木有跟gateway主动连接上以外(这个需要session在玩家登录时进行gateway的分配),其他需要连接的都已连接。
知道了连接关系以后,我们再来说下登录过程,大概是这样的:
1.选区。其实是选择session的过程(好吧,代码中是这样写的,其实我更想说的是选db的过程。因为游戏中只有一个session,还谈什么选择),每个区都有一组服务器,他们公用一个数据库。点击后进入账号输入登录界面。
2.账号验证。输入账号密码,点击进入游戏。session会通过dbx去数据库中查找账号密码是否正确,如果ok,返回服务器列表及各服务器人数情况(红色:爆满;绿色:少量玩家)。这就进入到world服务器选择界面。
3.选择world服务器 + 选择/创建角色。选择world服务器,点击进入游戏。session根据选择的world服务器ID,来分配gateway(gatewayID = wordID/2,相当于1个world对应两个gateway),同时产生校验码,最后发送gateway信息及校验码到client,发送验证码到gateway。client会去连接gateway,并在gateway中对校验码进行验证。验证成功后,gateway通知world加载角色及场景信息。最后,我们断开client跟session的连接。至此,我们完成了登录,进入到游戏中。
另外,有必要说下gateway与world的关系。没此有world去连接session的时候,session就会把所有gateway的信息(gatewayList)发送给world,world就会去连接所有的gateway,当然这时也会顺便在client中更新下服务器列表;而当有gateway去连接session的时候,session会更新gatewayList,并通知所有的world更新getewayList信息,同时去连接这个新添加的gateway。所有我们说,所有gateway跟所有world都有连接,恩,就是这样。