前面已经整理过了服务端代码,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);
}
}
}
二、注册响应类
接收前端数据,然后查询数据库是否有从名的,没有就添加,并返回成功

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);
}
}
}
三、重新编译,上传修改文件到服务端,重新启动服务进行测试。


