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, 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
- Photon 分布式服务器架设-处理子服务器注册请求(三)
- Photon 分布式服务器架设-创建数据传入子服务器(二)
- Photon分布式服务器架设-创建主服务器(一)
- Photon Server游戏服务器从零开始学习(三)在Unity3D中创建客户端与服务器连接及发送请求
- Unity+ Photon服务器实时对战游戏——Photon服务器介绍(三)
- FreeBSD WEB服务器架设笔记(三)
- FreeBSD WEB服务器架设笔记(三)
- Photon Server游戏服务器从零开始学习(六)游戏登录与注册操作
- Photon服务器引擎入门
- Photon服务器入门二
- Unity链接Photon服务器
- Photon服务器入门教程二
- Photon服务器引擎 入门教程
- photon服务器具体实例
- Unity Photon服务器
- Unity Photon服务器(二)
- 自己动手写web服务器三(web服务器是如何处理浏览器取消的请求的)
- 架设服务器
- MFC文件传输【原创】
- Redis学习(2)—— 实例与注释说明
- QTP_技巧
- 当代大学生思想与信仰问题论
- 把chrome请出系统盘,还让它自动更新
- Photon 分布式服务器架设-处理子服务器注册请求(三)
- Android BCM4330 蓝牙BT驱动调试记录
- Windows下面php5找不到php_curl.dll的问题
- 广播传送数据机制
- 关于LUN、PV、VG和LV
- lua文件操作(1)----基本读写
- PHP 文件系统函数分类总结
- git 本地仓库和远程服务器仓库没有一样的提交,用git pull出错
- 解决WebClient或HttpWebRequest首次连接缓慢问题