现在的位置: 首页 > 综合 > 正文

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

2019年07月22日 ⁄ 综合 ⁄ 共 3941字 ⁄ 字号 评论关闭

在第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

 



抱歉!评论已关闭.