Photon 分布式服务器架设-处理子服务器注册请求(三)

来源:互联网 发布:杭州理论培训网络授课 编辑:程序博客网 时间:2024/06/05 06:56


在第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, RegisterSubServer
using 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