zoukankan      html  css  js  c++  java
  • Photon Server 实现注册与登录(四) --- 服务端响应登陆和注册

    前面已经整理过了服务端代码,MyGameServer.cs 和 ClientPeer.cs 对请求和响应进行了拆分。接下来处理对前端的响应

    一、响应登陆请求

      之前整理中,响应前端请求主要在类ClientPeer.cs 中 OnOperationRequest 函数。该函数会根据前端传递的code从Handler管理组中取出响应的Handler进行响应。

    //ClientPeer.cs 中接收请求的函数
    //响应前端请求
            protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
            {
                MyGameServer.log.Info("Client---请求了---" + operationRequest.OperationCode);
    
                //首先获取客户端传来的code (operationRequest.OperationCode)
                //然后根据code 去 MyGameServer中获取注册的Handler。
                //Handler我们注册到了主函数HandlerDict中。
                //DictTool工具类是我们自己定义的,方便传入key,就能从Dict中取值,这里取出的是code相对应的handler
                
                BaseHandler handler = DictTool.GetValue<OperationCode, BaseHandler>(MyGameServer.Instance.HandlerDict,
                    (OperationCode) operationRequest.OperationCode);
    
                if (handler != null)
                {
                    //找到相应的Handler,直接调用 OnOperationRequest 进行相应逻辑处理
                    handler.OnOperationRequest(operationRequest,sendParameters,this);
                }
                else
                {
                    //如果没有找到,返回我们自定义的 DefaultHandler.
                    BaseHandler defHander = DictTool.GetValue<OperationCode, BaseHandler>(MyGameServer.Instance.HandlerDict,
                        OperationCode.Default);
                    
                    defHander.OnOperationRequest(operationRequest,sendParameters,this);
                }
                
            }

      登陆请求发送的code是 OperationCode.Login,主函数会从管理组中获取 LoginHander.cs ,然后调用LoginHandler.cs 的 OnOperationRequest()方法进行接收数据并处理。

      LoginHander.cs 登陆类

    using System;
    using Common;
    using Common.Toos;
    using MyGameServer.Manager;
    using Photon.SocketServer;
    
    namespace MyGameServer.Hander
    {
        public class LoginHander:BaseHandler
        {
            public LoginHander()
            {
                OpCode = OperationCode.Login;
            }
    
            public override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters, ClientPeer peer)
            {
                //利用工具类从获取客户端上传的参数
                string username =
                    DictTool.GetValue<byte, object>(operationRequest.Parameters, (byte) ParameterCode.UserName) as string;
                string password =
                    DictTool.GetValue<byte, object>(operationRequest.Parameters, (byte) ParameterCode.Password) as string;
                
                //数据库管理类
                UserManager userManager = new UserManager();
                
                //检测用户名和密码是否正确
                bool isOk = userManager.VerifyModel(username, password);
               
                //返回给客户端数据
                OperationResponse response = new OperationResponse(operationRequest.OperationCode);
                if (isOk)
                {
                    response.ReturnCode = (short)ReturnCode.Success;
                }
                else
                {
                    response.ReturnCode = (short)ReturnCode.Failed;
                }
    
                //给客户端响应
                peer.SendOperationResponse(response, sendParameters);
            }
        }
    }
    View Code

    二、注册响应类

      接收前端数据,然后查询数据库是否有从名的,没有就添加,并返回成功

    using Common;
    using Common.Toos;
    using MyGameServer.Manager;
    using MyGameServer.Model;
    using Photon.SocketServer;
    
    namespace MyGameServer.Hander
    {
        public class RegisterHandler:BaseHandler
        {
            public RegisterHandler()
            {
                OpCode = OperationCode.Register;
            }
    
            public override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters, ClientPeer peer)
            {
                //获取前端上传的参数
                string username =
                    DictTool.GetValue<byte, object>(operationRequest.Parameters, (byte) ParameterCode.UserName) as string;
                string password =
                    DictTool.GetValue<byte, object>(operationRequest.Parameters, (byte) ParameterCode.Password) as string;
                
                //返回给前端
                OperationResponse response = new OperationResponse(operationRequest.OperationCode);
                
                UserManager userManager = new UserManager();
                
                //查找是否已经存在该用户名
                User user = userManager.GetByName(username);
                if (user == null)
                {
                    //如果不存在,则添加该用户信息
                    user = new User(){UserName = username,Password = password};
                    userManager.Add(user);
    
                    //返回码,成功
                    response.ReturnCode = (short) ReturnCode.Success;
                }
                else
                {
                    //返回码,失败
                    response.ReturnCode = (short) ReturnCode.Failed;
                }
    
                //给客户端响应
                peer.SendOperationResponse(response, sendParameters);
            }
        }
    }
    View Code

    三、重新编译,上传修改文件到服务端,重新启动服务进行测试。

      

       

    查看视频:https://www.bilibili.com/video/av35109390/?p=86

  • 相关阅读:
    $().each和$("input[name='XXX']")
    常规JS操作
    日期大小比较JS方法
    集合迭代
    技术点1
    GItHub pages 的使用方法
    node.js是做什么的?
    jQuery基础:下(事件及动画效果)
    jQuery基础:上(样式及DOM操作)
    页码demo制作
  • 原文地址:https://www.cnblogs.com/cj8988/p/11691331.html
Copyright © 2011-2022 走看看