zoukankan      html  css  js  c++  java
  • Photon Server 实现注册与登录(二) --- 服务端代码整理

      

    一、有的代码前端和后端都会用到。比如一些请求的Code。使用需要新建项目存放公共代码。

      新建项目Common存放公共代码:

    EventCode :存放服务端自动发送信息给客户端的code
    OperationCode : 区分请求和响应
    ReturnCode : 服务端响应码
    ParameterCode : 解析参数
    Toos/DicTool.cs : 数据基本上都是用Dictionary读取,这里工具话一下。

    二、代码

    Toos/DicTool.cs
    using System.Collections.Generic;
    
    namespace Common.Toos
    {
        public class DictTool
        {
            //定义一个静态函数,传入key,就能取出Dict中相应的值
            public static T2 GetValue<T1, T2>(Dictionary<T1, T2> dict, T1 key)
            {
                T2 value;
                bool ok = dict.TryGetValue(key, out value);
                if (ok)
                {
                    return value;
                }
                else
                {
                    return default(T2);
                }
            }
        }
    }
    View Code
     EventCode.cs
    namespace Common
    {
        //服务端自动向客户端发送事件类型
        public enum EventCode : byte
        {
            
        }
    }
    View Code
    OperationCode.cs
    namespace Common
    {
        //区分请求和响应的请求
        public enum OperationCode : byte
        {
            Login,
            Register,
            Default
        }
    }
    View Code
    ReturnCode.cs
    namespace Common
    {
        public enum ReturnCode
        {
            Success,
            Failed
        }
    }
    View Code
    ParameterCode.cs
    namespace Common
     {
         //区分传输数据时的参数类型
         public enum ParameterCode:byte
         {
             UserName,
             Password
         }
     }
    View Code
    
    
    三、实现注册和登录,两个请求。服务端接收前端请求主要是在ClientPeer.cs文件的  OnOperationRequest() 函数中。如果今后请求变多,那这一块代码就会越来越多。所以现在整理一下代码,使用模块化区分开每个请求。

      使用Handler区分每个请求,让各自的请求处理自己的逻辑。基础Handler定义 OnOperationRequest() 函数,其他Handler都继承这个BaseHandler.

    导入公共类Common:

      

    新建目录和文件。BaseHandler 父类,LoginHandler和RegisterHandler分别处理登录和注册,DefaultHandler处理默认请求。

      (1)、BaseHandler.cs,其他所有handler类都继承该类。

    using Common;
    using Photon.SocketServer;
    
    namespace MyGameServer.Hander
    {
        public abstract class BaseHandler
        {
         //区分请求接口
    public OperationCode OpCode; public abstract void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters, ClientPeer peer); } }

       (2)、DefaultHandler.cs

    using Common;
    
    using Photon.SocketServer;
    
    namespace MyGameServer.Hander
    {
        public class DefaultHandler:BaseHandler
        {
            public DefaultHandler()
            {
                OpCode = OperationCode.Default;
            }
    
            public override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters, ClientPeer peer)
            {
               
            }
        }
    }

        (3)、LoginHandler.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)
            {
               
            }
        }
    }

       (4)、RegisterHandler.cs

    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)
            {
                
            }
        }
    }

    四、注册Handler。添加Handler后,我们需要使用方便,得在主函数中进行注册。

    修改MyGameSerer.cs文件:

      (1)、添加一个变量,用于存放Handler

        public Dictionary<OperationCode,BaseHandler> HandlerDict = new Dictionary<OperationCode, BaseHandler>();

           (2)、添加MyGameServer管理单例类。

     public new static MyGameServer Instance { get; private set; }

          (3)、注册Handler,在Setup()函数中添加

     Instance = this;
     InitHandler();

          (4)、添加Handler,新建函数 InitHandler()

           private void InitHandler()
            {
                LoginHander loginHander = new LoginHander();
                HandlerDict.Add(loginHander.OpCode,loginHander);
                
                DefaultHandler defaultHandler = new DefaultHandler();
                HandlerDict.Add(defaultHandler.OpCode,defaultHandler);
                
                RegisterHandler registerHandler = new RegisterHandler();
                HandlerDict.Add(registerHandler.OpCode,registerHandler);
            }

         (5)、完整代码

    using System.Collections.Generic;
    using System.IO;
    using Common;
    using ExitGames.Logging;
    using ExitGames.Logging.Log4Net;
    using log4net;
    using log4net.Config;
    using MyGameServer.Hander;
    using MyGameServer.Manager;
    using MyGameServer.Model;
    using Photon.SocketServer;
    using LogManager = ExitGames.Logging.LogManager;
    
    namespace MyGameServer
    {
        //继承 ApplicationBase
        public class MyGameServer : ApplicationBase
        {
            //日志打印
            public static readonly ILogger log = LogManager.GetCurrentClassLogger();
    
            public new static MyGameServer Instance { get; private set; }
            
            public Dictionary<OperationCode,BaseHandler> HandlerDict = new Dictionary<OperationCode, BaseHandler>();
                            
                                    
            //客户端创建链接
            //使用一个peerbase表示一个客户端连接
            protected override PeerBase CreatePeer(InitRequest initRequest)
            {
                log.Info("Client  Connect----------");
                //创建一个客户端返回给引擎,引擎自动管理
                return new ClientPeer(initRequest);
            }
    
            //服务器启动时调用
            protected override void Setup()
            {
                LogManager.SetLoggerFactory(Log4NetLoggerFactory.Instance);
                GlobalContext.Properties["Photon:ApplicationLogPath"] = Path.Combine(ApplicationRootPath, "log");
                GlobalContext.Properties["LogFileName"] = "MySer_" + ApplicationName;
                XmlConfigurator.ConfigureAndWatch(new FileInfo(Path.Combine(BinaryPath, "log4net.config")));
                
                log.Info("MyGameServer start----------");
    
                
                Instance = this;
                InitHandler();
            }
    
            private void InitHandler()
            {
                LoginHander loginHander = new LoginHander();
                HandlerDict.Add(loginHander.OpCode,loginHander);
                
                DefaultHandler defaultHandler = new DefaultHandler();
                HandlerDict.Add(defaultHandler.OpCode,defaultHandler);
                
                RegisterHandler registerHandler = new RegisterHandler();
                HandlerDict.Add(registerHandler.OpCode,registerHandler);
            }
    
            //服务器停止调用
            protected override void TearDown()
            {
                log.Info("MyGameServer down----------");
            }
        }
    }
    View Code

    五、修改文件ClientPeer.cs,分发请求到每个Handler中取。根据客户端传来的code判断是哪个请求,找到相应的Handler,然后将上传的参数分发给该Handler进行逻辑处理。

    using System.Collections.Generic;
    using Common;
    using Common.Toos;
    using MyGameServer.Hander;
    using Photon.SocketServer;
    using PhotonHostRuntimeInterfaces;
    
    namespace MyGameServer
    {
        
        public class ClientPeer : Photon.SocketServer.ClientPeer
        {
            //创建客户端
            public ClientPeer(InitRequest initRequest) : base(initRequest)
            {
            }
    
            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);
                }
                
            }
    
            //处理客户端断开连接
            protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
            {
                MyGameServer.log.Info("Client------断开了");
            }
        }
    }

    到此,服务端代码整理完成。下面进行前端处理。

  • 相关阅读:
    大爽Python入门教程 3-6 答案
    大爽Python入门教程 2-5 *拓展实践,对比与思考
    大爽Python入门教程 3-1 布尔值: True, False
    大爽Python入门教程 3-2 条件判断: if...elif..else
    企业微信获取code
    python inspect模块
    数据仓库之数据质量建设(深度好文)
    seleniumwire
    Jacoco增量代码覆盖率
    git对已经提交过的文件添加到.gitignore
  • 原文地址:https://www.cnblogs.com/cj8988/p/11690891.html
Copyright © 2011-2022 走看看