前面已经整理过了服务端代码,MyGameServer.cs 和 ClientPeer.cs 对请求和响应进行了拆分。接下来处理对前端的响应前端
1、响应登录请求数据库
以前整理中,响应前端请求主要在类ClientPeer.cs 中 OnOperationRequest 函数。该函数会根据前端传递的code从Handler管理组中取出响应的Handler进行响应。ide
//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); } } }
2、注册响应类测试
接收前端数据,而后查询数据库是否有从名的,没有就添加,并返回成功this
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); } } }
3、从新编译,上传修改文件到服务端,从新启动服务进行测试。spa