Photon 分布式服务器架设(三)
转自:http://blog.csdn.net/huihuilaopo/article/details/8746481
在第2部分中,我们讨论了让我们连接到子服务器与传入的SubServerPeer类。在这部分中,我们将创建支持类,我们需要处理我们第一次操作请求的RegisterSubServer。
我想首先开始在我们的解决方案组织文件。我想把MasterServer.cs和 IncomingSubServerPeer cs,并将它们移到MasterServer文件夹。之后,我想继续更新他们的名称空间为Server2Server.MasterServer。 一旦完成,我想创建另一个文件夹在基地的项目称为Server2Server。这就是我们仍然存储的东西,具体去MasterServer和 SubServers之间,在Server2Server文件夹,创建另一个文件夹叫操作。
一旦我们设置了文件夹,我想继续创建第一个类,ErrorCode类在Server2Server文件夹内。
- <pre class="csharp" name="code">namespace Server2Server.Server2Server
- {
- public enum ErrorCode
- {
- OperationDenied = -3,
- OperationInvalid = -2,
- InternalServerError = -1,
- Ok = 0,
- }
- }
- </pre>
- <pre>下一步在Operations文件夹内创建OperationCode.cs:</pre>
- <pre class="csharp" name="code"><pre class="csharp" name="code">namespace Server2Server.Server2Server.Operations
- {
- public enum OperationCode
- {
- RegisterSubServer = 1,
- }
- }
- 然后创建Operation, RegisterSubServer</pre><pre class="csharp" name="code">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()
- {
- }
- }
- }
- </pre>
- <p>有了类,我们要实现那些需要的方法。我们要知道连接到我们的服务器地址、ServerID、Tcp或Udp和服务器类型。 Exit Games提供了一个对应操作类的属性,这个属性DataMember带有一个Code(byte型的OperationRequest.Code),而且我们要知道哪些参数是可选的。</p>
- <p> </p>
- <pre class="csharp" name="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; }
- }</pre>
- <p><br>
- 修改IncomingSubServerPeer.OnOperationRequest()函数,来处理请求:</p>
- <pre class="csharp" name="code">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);
- }
- </pre>
- <p> </p>
- <p>再创建一个函数HandleRegisterSubServerRequest,这个函数存储我们要发送的所有数据,添加属性来存储这些数据。</p>
- <pre class="csharp" name="code">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;
- }
- }</pre>
- <p><br>
- <br>
- 再创建一个枚举类</p>
- <pre class="csharp" name="code">using System;
- namespace Server2Server.Server2Server
- {
- [Flags]
- public enum SubServerType
- {
- Login = 1,
- Chat = 2,
- Region = 4,
- }
- }
- </pre>
- <p><br>
- 下面来实现HandleRegisterSubServerRequest,首先检查Request是否是一个有效的RegisterSubServer,如果不是,则报告错误,否则记录发送的值。然后把这些值存在我们上面创建的属性中。注意返回消息。</p>
- <pre class="csharp" name="code">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);
- }
- </pre><pre class="csharp" name="code"> </pre><pre class="csharp" name="code">源文链接:<a href="http://www.j2megame.com/html/xwzx/ty/3468.html">http://www.j2megame.com/html/xwzx/ty/3468.html</a></pre>
- <p> </p>
- <pre></pre>
- <pre></pre>
- </pre>