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文件夹内。

[csharp] view plaincopy
 
  1. <pre class="csharp" name="code">namespace Server2Server.Server2Server  
  2. {  
  3.     public enum ErrorCode  
  4.     {  
  5.         OperationDenied = -3,  
  6.         OperationInvalid = -2,  
  7.         InternalServerError = -1,  
  8.    
  9.         Ok = 0,  
  10.     }  
  11. }  
  12. </pre>  
  13. <pre>下一步在Operations文件夹内创建OperationCode.cs:</pre>  
  14. <pre class="csharp" name="code"><pre class="csharp" name="code">namespace Server2Server.Server2Server.Operations  
  15. {  
  16.     public enum OperationCode  
  17.     {  
  18.         RegisterSubServer = 1,  
  19.     }  
  20. }  
  21. 然后创建Operation, RegisterSubServer</pre><pre class="csharp" name="code">using System;  
  22. using Photon.SocketServer;  
  23. using Photon.SocketServer.Rpc;  
  24.    
  25. namespace Server2Server.Server2Server.Operations  
  26. {  
  27.     class RegisterSubServer : Operation  
  28.     {  
  29.         public RegisterSubServer(IRpcProtocol protocol, OperationRequest operationRequest) : base(protocol, operationRequest)  
  30.         {  
  31.               
  32.         }  
  33.    
  34.         public RegisterSubServer()  
  35.         {  
  36.               
  37.         }  
  38.     }  
  39. }  
  40. </pre>  
  41. <p>有了类,我们要实现那些需要的方法。我们要知道连接到我们的服务器地址、ServerID、Tcp或Udp和服务器类型。 Exit Games提供了一个对应操作类的属性,这个属性DataMember带有一个Code(byte型的OperationRequest.Code),而且我们要知道哪些参数是可选的。</p>  
  42. <p> </p>  
  43. <pre class="csharp" name="code">class RegisterSubServer : Operation  
  44.     {  
  45.         [DataMember(Code = 4, IsOptional = false)]  
  46.         public string ServerAddress { getset; }  
  47.    
  48.         [DataMember(Code = 3, IsOptional = false)]  
  49.         public Guid ServerId { getset; }  
  50.    
  51.         [DataMember(Code = 2, IsOptional = true)]  
  52.         public int TcpPort { getset; }  
  53.    
  54.         [DataMember(Code = 1, IsOptional = true)]  
  55.         public int UdpPort { getset; }  
  56.    
  57.         [DataMember(Code = 5, IsOptional = false)]  
  58.         public int ServerType { getset; }  
  59.     }</pre>  
  60. <p><br>  
  61. 修改IncomingSubServerPeer.OnOperationRequest()函数,来处理请求:</p>  
  62. <pre class="csharp" name="code">protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)  
  63.         {  
  64.             if(Log.IsDebugEnabled)  
  65.             {  
  66.                 Log.DebugFormat("Received operation request from {0} - op code {1}", ConnectionId, operationRequest.OperationCode);  
  67.             }  
  68.    
  69.             OperationResponse response;  
  70.    
  71.             switch ((OperationCode)operationRequest.OperationCode)  
  72.             {  
  73.                 case OperationCode.RegisterSubServer:  
  74.                     response = ServerId.HasValue  
  75.                                    ? new OperationResponse(operationRequest.OperationCode)  
  76.                                          {  
  77.                                              ReturnCode = (short) ErrorCode.OperationInvalid,  
  78.                                              DebugMessage = "Already Registered"  
  79.                                          }  
  80.                                    : HandleRegisterSubServerRequest(operationRequest);  
  81.                     break;  
  82.                 default:  
  83.                     response = new OperationResponse(operationRequest.OperationCode) {ReturnCode = (short)ErrorCode.OperationInvalid, DebugMessage = "Unknown Operation Request"};  
  84.                     break;  
  85.             }  
  86.    
  87.             SendOperationResponse(response, sendParameters);  
  88.         }  
  89. </pre>  
  90. <p> </p>  
  91. <p>再创建一个函数HandleRegisterSubServerRequest,这个函数存储我们要发送的所有数据,添加属性来存储这些数据。</p>  
  92. <pre class="csharp" name="code">class IncomingSubServerPeer : ServerPeerBase  
  93. {  
  94.         private Guid ServerId;   
  95.         private MasterServer _server;  
  96.         private static readonly ILogger Log = LogManager.GetCurrentClassLogger();  
  97.    
  98.         public string UdpAddress { getprotected set; }  
  99.         public string TcpAddress { getprotected set; }  
  100.    
  101.         public SubServerType SubServerType  
  102.         {  
  103.             getprotected set;  
  104.         }  
  105. }</pre>  
  106. <p><br>  
  107. <br>  
  108. 再创建一个枚举类</p>  
  109. <pre class="csharp" name="code">using System;  
  110.    
  111. namespace Server2Server.Server2Server  
  112. {  
  113.     [Flags]  
  114.     public enum SubServerType  
  115.     {  
  116.         Login = 1,  
  117.         Chat = 2,  
  118.         Region = 4,  
  119.     }  
  120. }  
  121. </pre>  
  122. <p><br>  
  123. 下面来实现HandleRegisterSubServerRequest,首先检查Request是否是一个有效的RegisterSubServer,如果不是,则报告错误,否则记录发送的值。然后把这些值存在我们上面创建的属性中。注意返回消息。</p>  
  124. <pre class="csharp" name="code">private OperationResponse HandleRegisterSubServerRequest(OperationRequest operationRequest)  
  125. {  
  126.             var registerRequest = new RegisterSubServer(Protocol, operationRequest);  
  127.             if(!registerRequest.IsValid)  
  128.             {  
  129.                 string msg = registerRequest.GetErrorMessage();  
  130.                 if(Log.IsDebugEnabled)  
  131.                 {  
  132.                     Log.DebugFormat("Invalid Register request: {0}", msg);  
  133.                 }  
  134.    
  135.                 return new OperationResponse(operationRequest.OperationCode) { DebugMessage = msg, ReturnCode = (short)ErrorCode.OperationInvalid};  
  136.             }  
  137.    
  138.             if(Log.IsDebugEnabled)  
  139.             {  
  140.                 Log.DebugFormat("Received register request: Address={0}, UdpPort={1}, TcpPort={2}, Type={3}",  
  141.                     registerRequest.ServerAddress,  
  142.                     registerRequest.UdpPort,  
  143.                     registerRequest.TcpPort,  
  144.                     registerRequest.ServerType);  
  145.             }  
  146.    
  147.             if(registerRequest.UdpPort.HasValue)  
  148.             {  
  149.                 UdpAddress = registerRequest.ServerAddress + ":" + registerRequest.UdpPort;  
  150.             }  
  151.    
  152.             if(registerRequest.TcpPort.HasValue)  
  153.             {  
  154.                 TcpAddress = registerRequest.ServerAddress + ":" + registerRequest.TcpPort;  
  155.             }  
  156.    
  157.             ServerId = registerRequest.ServerId;  
  158.             SubServerType = (SubServerType)registerRequest.ServerType;  
  159.    
  160.             return new OperationResponse(operationRequest.OperationCode);  
  161. }  
  162. </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>  
  163. <p> </p>  
  164. <pre></pre>  
  165. <pre></pre>  
  166.      
  167. </pre>  

分享到: 微信 更多