Photon Server 实现注册与登录 --- 服务端代码整理
Posted cj8988
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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); } } } }
EventCode.cs
namespace Common { //服务端自动向客户端发送事件类型 public enum EventCode : byte { } }
OperationCode.cs
namespace Common { //区分请求和响应的请求 public enum OperationCode : byte { Login, Register, Default } }
ReturnCode.cs
namespace Common { public enum ReturnCode { Success, Failed } }
ParameterCode.cs
namespace Common { //区分传输数据时的参数类型 public enum ParameterCode:byte { UserName, Password } }
三、实现注册和登录,两个请求。服务端接收前端请求主要是在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----------"); } } }
五、修改文件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------断开了"); } } }
到此,服务端代码整理完成。下面进行前端处理。
以上是关于Photon Server 实现注册与登录 --- 服务端代码整理的主要内容,如果未能解决你的问题,请参考以下文章
(超简单基础版)ASP.NET(.Net Framework)三层架构,结合sql server实现登录与注册