在第2部分中,我们讨论了让我们连接到子服务器与传入的SubServerPeer类。在这部分中,我们将创建支持类,我们需要处理我们第一次操作请求的RegisterSubServer。
我想首先开始在我们的解决方案组织文件。我想把MasterServer.cs和 IncomingSubServerPeer cs,并将它们移到MasterServer文件夹。之后,我想继续更新他们的名称空间为Server2Server.MasterServer。 一旦完成,我想创建另一个文件夹在基地的项目称为Server2Server。这就是我们仍然存储的东西,具体去MasterServer和 SubServers之间,在Server2Server文件夹,创建另一个文件夹叫操作。
一旦我们设置了文件夹,我想继续创建第一个类,ErrorCode类在Server2Server文件夹内。
namespace Server2Server.Server2Server { public enum ErrorCode { OperationDenied = -3, OperationInvalid = -2, InternalServerError = -1, Ok = 0, } }下一步在Operations文件夹内创建OperationCode.cs:namespace Server2Server.Server2Server.Operations { public enum OperationCode { RegisterSubServer = 1, } } 然后创建Operation, RegisterSubServerusing System; using Photon.SocketServer; using Photon.SocketServer.Rpc; namespace Server2Server.Server2Server.Operations { class RegisterSubServer : Operation { public RegisterSubServer(IRpcProtocol protocol, OperationRequest operationRequest) : base(protocol, operationRequest) { } public RegisterSubServer() { } } }有了类,我们要实现那些需要的方法。我们要知道连接到我们的服务器地址、ServerID、Tcp或Udp和服务器类型。 Exit Games提供了一个对应操作类的属性,这个属性DataMember带有一个Code(byte型的OperationRequest.Code),而且我们要知道哪些参数是可选的。
class RegisterSubServer : Operation { [DataMember(Code = 4, IsOptional = false)] public string ServerAddress { get; set; } [DataMember(Code = 3, IsOptional = false)] public Guid ServerId { get; set; } [DataMember(Code = 2, IsOptional = true)] public int TcpPort { get; set; } [DataMember(Code = 1, IsOptional = true)] public int UdpPort { get; set; } [DataMember(Code = 5, IsOptional = false)] public int ServerType { get; set; } }修改IncomingSubServerPeer.OnOperationRequest()函数,来处理请求:
protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters) { if(Log.IsDebugEnabled) { Log.DebugFormat("Received operation request from {0} - op code {1}", ConnectionId, operationRequest.OperationCode); } OperationResponse response; switch ((OperationCode)operationRequest.OperationCode) { case OperationCode.RegisterSubServer: response = ServerId.HasValue ? new OperationResponse(operationRequest.OperationCode) { ReturnCode = (short) ErrorCode.OperationInvalid, DebugMessage = "Already Registered" } : HandleRegisterSubServerRequest(operationRequest); break; default: response = new OperationResponse(operationRequest.OperationCode) {ReturnCode = (short)ErrorCode.OperationInvalid, DebugMessage = "Unknown Operation Request"}; break; } SendOperationResponse(response, sendParameters); }
再创建一个函数HandleRegisterSubServerRequest,这个函数存储我们要发送的所有数据,添加属性来存储这些数据。
class IncomingSubServerPeer : ServerPeerBase { private Guid ServerId; private MasterServer _server; private static readonly ILogger Log = LogManager.GetCurrentClassLogger(); public string UdpAddress { get; protected set; } public string TcpAddress { get; protected set; } public SubServerType SubServerType { get; protected set; } }再创建一个枚举类
using System; namespace Server2Server.Server2Server { [Flags] public enum SubServerType { Login = 1, Chat = 2, Region = 4, } }下面来实现HandleRegisterSubServerRequest,首先检查Request是否是一个有效的RegisterSubServer,如果不是,则报告错误,否则记录发送的值。然后把这些值存在我们上面创建的属性中。注意返回消息。
private OperationResponse HandleRegisterSubServerRequest(OperationRequest operationRequest) { var registerRequest = new RegisterSubServer(Protocol, operationRequest); if(!registerRequest.IsValid) { string msg = registerRequest.GetErrorMessage(); if(Log.IsDebugEnabled) { Log.DebugFormat("Invalid Register request: {0}", msg); } return new OperationResponse(operationRequest.OperationCode) { DebugMessage = msg, ReturnCode = (short)ErrorCode.OperationInvalid}; } if(Log.IsDebugEnabled) { Log.DebugFormat("Received register request: Address={0}, UdpPort={1}, TcpPort={2}, Type={3}", registerRequest.ServerAddress, registerRequest.UdpPort, registerRequest.TcpPort, registerRequest.ServerType); } if(registerRequest.UdpPort.HasValue) { UdpAddress = registerRequest.ServerAddress + ":" + registerRequest.UdpPort; } if(registerRequest.TcpPort.HasValue) { TcpAddress = registerRequest.ServerAddress + ":" + registerRequest.TcpPort; } ServerId = registerRequest.ServerId; SubServerType = (SubServerType)registerRequest.ServerType; return new OperationResponse(operationRequest.OperationCode); }源文链接:http://www.j2megame.com/html/xwzx/ty/3468.html