【转】登录流程

首先是客户端的登录过程

 

1、客户端(client)连接登录服(login) !

2、连接成功后client与login通过同样的算法生成各自的密钥并彼此交换,然后各自用自己和对方的密钥生成一个密匙(secret),两个secret必须是一样的,否则服务端抛出错误,连接失败

3、密匙验证成功。client带着用户的登录账户、登录密码、以及用户选择要登录的服务器(目前不能选择,由login分配)与secret一起encode后去login做登录验证。

4、login在decode client的账户信息后与数据库中的信息验证,有三种结果!!

  • 数据库中无此账号信息则自动注册 返回成功

  • 数据库中有此账号信息但密码错误 返回失败

  • 数据库中有此账号信息且密码正确 返回成功!!!

5、第4步失败则给client返回错误码,成功后(会先判断玩家是否已经在线,如果是则先将其踢下线)则由login选定一个网关服(gate),并向其注册一个玩家即将登陆的消息,gate回返回一个subid,然后login将此subid以及gate的ip、name发给cilent,至此,login的工作完成,接着主动关闭这条连接。

6、gate在收到login的登录消息时会为该账号启动一个msgagent服务

7、client在收到login发来的gate的信息后会开始连接gate,然后将账号名,gate的name、subid与secret打包发给gate做验证

8、gate收到client发来的验证信息后与本地的注册列表进行对比验证,然后给client返回验证结果

9、client收到gate的验证正确的结果后,与gate的连接正式建立!!!

下面是客户端的消息流转过程

 

1、client发送第一条业务请求获取存档信息,此时client的消息会经过webgateserver和webmsgserver后正确路由到对应的msgagent中

    注意获取存档的消息和进入游戏的消息是玩家还未进入游戏时发的,这两条消息是在msgagent处理的。在收到enter_game消息后,msgagent会选择一个gamenode让其进入,玩家在进入game后会在msgagent上注册他所在的gamenode,agentaddr以及role_id等一些信息

2、msgagent会根据协议以及玩家在msgagent上注册的信息将数据正确的发送到对应的服务上,并会携带一个ctx

几个注意点

 

1、废弃了之前获取玩家信息的借口"get_player_online_state",你想要的信息ctx里一般都有,如果没有请告诉我,或者你自己加上

图片描述

2、添加了两个context接口

  1.  

    context.send_to_client(role_list, proto, data)

    !12 role_list为空则想所有在线玩家发送

    role_list为一个列表,则想列表里的roleid发送

    role_list为一个number(role_id)则向此玩家发送!

     

  2.  

    context.get_role_msgagent(role_id)

    通过role_id获取玩家的msgagent,使用时请对返回值做判断,若为nil则role_id不在线,得到的msgagent信息与ctx差不多

     

后期工作

 

基于此架构,后期与单个玩家挂钩的功能可以直接作为一个模块挂在game的agent上,不用再另起服务(如聊天和弹幕),hall上只处理与多个玩家相关的逻辑(如排行榜、场景及商店等)

 

 
posted @ 2019-02-25 18:20  colourstar  阅读(2472)  评论(2编辑  收藏  举报