您当前的位置: 首页 > 

CloudHu1989

暂无认证

  • 4浏览

    0关注

    89博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ET学习笔记之五星麻将1

CloudHu1989 发布时间:2019-09-30 17:00:44 ,浏览量:4

五星麻将1客户端登录流程
    • 前言
    • 登录流程
      • 联网登录KCPUseManage
      • 联网配置
      • 数据库MongoDB
      • 进入游戏大厅
      • 作者的话

前言

虽然只是在记录学习经过,但是对于我来说要表述清楚整个逻辑也并非易事。于是我能做的就是尽量把整个思路详实记录下来,这样即使表述不清也可以供人参考,就像代码的执行过程的Review一样。 因此,我大概就是通过这样的Review来成文的,整个执行过程都可以通过Debug来确认重现。 关于ET整个框架,关于五星麻将,上一篇已经铺垫差不多了,这一篇讲整个登录流程。

登录流程

上一篇我们已经可以展示登录界面了,如下图所示: 登录界面 我们通过资源加载流程也可以找到对应的预设: 登录预设 UGUI的基本组件很简单,没有什么好说的,当点下登录按钮就触发连接服务器的方法Game.Scene.GetComponent().LoginAndConnect(LoginType.Editor, mAccountInputField.text);这里使用的是编辑器模式,对应的方法在LoginPanelComponent.cs中。 逻辑比较简单,如果是测试就使用丑陋的红色登录界面,如果是正式的就会使用微信登录。当然,还有快捷登录方式,也就是说用户终端上已经记录了登录凭证,就通过凭证快速登录了。 代码就不复制了,UI的MVC模式也是老生常谈的技术了,所以也不啰嗦了。

联网登录KCPUseManage

上篇讲过事件机制,这里跳过,直接上LoginAndConnect的代码:

        //登陆并连接
        public async void LoginAndConnect(int loginType, string dataStr,bool isReconnection=false)
        {
            _UpLoginType = loginType;
            _UpLoginDataStr = dataStr;
            if (_mStateManage.pKCPNetWorkState == KCPNetWorkState.BebeingConnect|| _mStateManage.pKCPNetWorkState == KCPNetWorkState.Connect)
            {
                Log.Warning("正在连接 请不要重复连接 或已经成功连接");
            }
            try
            {
                
               
                _mStateManage.StartConnect();
                //根据是否重连 注册 连接成功 是连接失败的事件
                mSocketCantConnectCall = _mStateManage.ConnectFailure;//连接失败
                Action connectSuccesAction = _mStateManage.ConnectSuccess;//连接成功
                //如果是重连 更改一下回调
                if (isReconnection)
                {
                    mSocketCantConnectCall = _mStateManage.AgainConnectFailure;
                    connectSuccesAction = _mStateManage.AgainConnectSuccess;
                }
                Log.Debug("验证服地址:"+ GameVersionsConfigMgr.Ins.ServerAddress);
                // 创建一个ETModel层的Session
                ETModel.Session session = ETModel.Game.Scene.GetComponent().Create(GameVersionsConfigMgr.Ins.ServerAddress);
                // 创建一个ETHotfix层的Session, ETHotfix的Session会通过ETModel层的Session发送消息
                Session realmSession = ComponentFactory.Create(session);
                realmSession.session.GetComponent().DisposeCallback += RealmSessionDisposeCallback;
                //登陆验证服务器
                R2C_CommonLogin r2CLogin =(R2C_CommonLogin)await realmSession.Call(new C2R_CommonLogin()
                {
                    LoginType = loginType,
                    PlatformType = HardwareInfos.pCurrentPlatform,
                    DataStr = dataStr,
                });
                realmSession.Dispose();
                if (!string.IsNullOrEmpty(r2CLogin.Message))
                {
                    if (PlayerPrefs.HasKey(GlobalConstant.LoginVoucher))
                    {
                        PlayerPrefs.DeleteKey(GlobalConstant.LoginVoucher);//登陆失败的话 如果有凭证 就删除凭证
                    }
                    UIComponent.GetUiView().ShowOptionWindow(r2CLogin.Message,null, PopOptionType.Single);//显示提示
                    UIComponent.GetUiView().Hide();//隐藏圈圈
                    _mStateManage.pKCPNetWorkState = KCPNetWorkState.Disconnectl;//状态改为断开连接
                    Game.Scene.GetComponent().StartGame(ToyGameId.Login);//进入登陆界面
                    return;
                }
                PlayerPrefs.SetString(GlobalConstant.LoginVoucher, r2CLogin.LoginVoucher);//记录登陆凭证
                //登陆网关服务器
                G2C_GateLogin g2CLoginGate =await ConnectGate(r2CLogin.Address, r2CLogin.Key, loginType);
                if (!string.IsNullOrEmpty(g2CLoginGate.Message))
                {
                    UIComponent.GetUiView().ShowOptionWindow(g2CLoginGate.Message, null, PopOptionType.Single);
                    UIComponent.GetUiView().Hide();//隐藏圈圈
                    _mStateManage.pKCPNetWorkState = KCPNetWorkState.Disconnectl;//状态改为断开连接
                    return;
                }
                //发起连接成功事件
                connectSuccesAction(g2CLoginGate);
            }
            catch (Exception e)
            {
                Log.Error(e);
                throw;
            }
        }

当我们随便输入一个帐号,再点击登陆按钮,就触发上面这个方法了,但是我们是连不上的。原因很简单,这里的验证服地址GameVersionsConfigMgr.Ins.ServerAddress根本不是我们配置的本地服务器地址。

联网配置

所以我们需要重新配置,打开配置文件重新配置即可,如下图所示: 配置文件 打开这个配置文件,配置如下:

{"AssetBundleServerUrl":"http://*:8080/","Address":"127.0.0.1:10002"}

这个时候我们还需要检查下服务器的配置,找到…/Config/StartConfig/LocalAllServer.txt文件,配置如下:

{ "_t" : "StartConfig", "_id" : NumberLong("98547768819754"), "C" : [{ "_t" : "OuterConfig", "Address" : "127.0.0.1:10002", "Address2" : "127.0.0.1:10002" }, { "_t" : "InnerConfig", "Address" : "127.0.0.1:20000" }, { "_t" : "HttpConfig", "Url" : "http://*:8080/", "AppId" : 0, "AppKey" : "", "ManagerSystemUrl" : "" }, { "_t" : "DBConfig", "ConnectionString" : "mongodb://127.0.0.1:27017", "DBName" : "GaneGather" }], "AppId" : 1, "AppType" : "AllServer", "ServerIP" : "*" }

关于ET的配置规则,属于是基本操作了,如果阁下不太明白,我在上一篇留下了传送门。

数据库MongoDB

ET的默认数据是MongoDB,当然,我们完全可以修改成其他数据库,只是MongoDB仍然是我们的首选。原因ET的作者熊猫大佬也解释的非常清楚了,这里不再重复赘述。 那么我们上面的那个配置文件中也对MongoDB进行了配置,这里要做的实际上是安装。 MongoDB的安装和使用,已经有另外一个大佬讲过了,所以我也不讲,这里留下传送门。 TA的博客模版很好看,二次元可爱风,所以按照TA的教程安装即可。至于MongoDB的Compass,TA没有安装,我却安装了,毕竟可视化的软件可以减少我们很多工作量。 编译运行服务器端,呃,这个真的是基本操作了。运行之后,我们发现MongoDB中已经有配置文件中对应的数据了。配置文件中DBName是GaneGather,对应的数据库是根据配置文件来创建的,如图所示: GaneGather数据库 作者非常贴心地为我们准备好了许多基础数据,直接使用即可。

进入游戏大厅

数据库和服务器都没有问题了,接下来登录即可,登录后进入游戏大厅,如图所示: 游戏大厅 至此,登录流程就走完了,实际上省略了非常多东西,真实的项目登录起来会有更多流程: 1:由第三方平台(如九游,腾讯游戏平台等)提供的 SDK 里的界面进行注册或登录,其登录将给我们一个 token 2:请求最新的服务器列表,可通过 http 取下来.(优化:服务器列表可以分成若干文件提高用户体验) 3:前端向登录服务器请求连接,然后一连接成功就会收到一个登录服务器的随机值(challenge) 4:前端发一个经过 dhexchange 的随机值 (handshake_client_key) 给登录服务器 5:登录服务器收到 handshake_client_key 后生成并发送 handshake_server_key 给前端,此时双方可算出密钥 secret 了 6:前端利用之前收到的 challenge 和算出的 secret 生成并发送 hmac 和 token 信息(包含帐号密码和游戏服务器标识)给登录服务器 7:登录服务器验证用户信息后告诉前端是否验证成功(200 subid 或者400 Bad Request 等) 8:开始请求连接游戏服务器 M,连接上后前端利用 secret 和 subid 生成并发送握手校验给 M 9:收到游戏服务器 M 的校验结果(成功为200) 10:可以正常向游戏服务器收发协议了 这些流程,也许以后会讲一下,毕竟现在我不具备商业资质,所以恐怕根本跑不通。当然也不一定需要具备资质才能讲,第三方开放平台就可以申请到一些方便的微信和QQ登录通道。 Anyway,这一篇还是尽量简单点好了,登录到游戏大厅后,我们会发现帧同步不太爽。 欲知后事如何,请听下回分解!

作者的话

Alt

如果喜欢可以点赞支持一下,谢谢鼓励!如果有什么疑问可以给我留言,有错漏的地方请批评指证! 技术难题?加入开发者联盟:566189328(QQ付费群)提供有限技术探讨,以及,心灵鸡汤Orz! 当然,不需要技术探讨也欢迎加入进来,在这里劈柴、遛狗、聊天、撸猫!( ̄┰ ̄*)

关注
打赏
1664096582
查看更多评论
立即登录/注册

微信扫码登录

0.1844s