Photon Server 实现注册与登录(二) --- 服务端代码整理

  

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

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

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

Photon Server 实现注册与登录(二) --- 服务端代码整理

二、代码

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:

Photon Server 实现注册与登录(二) --- 服务端代码整理  Photon Server 实现注册与登录(二) --- 服务端代码整理

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

Photon Server 实现注册与登录(二) --- 服务端代码整理

  (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------断开了");
        }
    }
}

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

相关推荐