服务器如何分发消息和处理消息
- 创建一个协议项目 Protocol 类库
namespace Protocal
{
//返回码
public enum ReturnCode : short
{
Success,
Failed
}
//客户端向服务器发送消息,服务器向客户端回应消息,称之为 Operation
//区分请求和响应的类型
public enum OperationType : byte
{
Default,
Register, //注册
Login, //登录
}
//服务器主动向客户端推送消息,称之为Event
//区分服务器向客户端发送的事件的类型
public enum EventType : byte
{
}
//区分传送数据的时候,参数的类型
public enum ParameterCode : byte
{
Username,
Password,
}
}
- 在协议项目主目录下,创建DicManager.cs
using System.Collections.Generic;
namespace Protocal
{
public class DicManager
{
public static T2 GetValue<T1, T2>(Dictionary<T1, T2> dic, T1 key)
{
T2 value;
bool IsSuccess = dic.TryGetValue(key, out value);
if (IsSuccess)
{
return value;
}
else
{
return default(T2);
}
}
}
}
- 在服务器项目中,添加项目对协议项目的引用:
- 封装处理消息的类:
using Protocal;
using Photon.SocketServer;
namespace zclServer
{
//封装处理消息的抽象类
public abstract class BaseHandler
{
//消息类型
public OperationType code;
//处理消息
public abstract void OnOperationRequest(ClientSession peer, OperationRequest operationRequest, SendParameters sendParameters);
}
//默认的处理消息的方式
public class DefaultHandler : BaseHandler
{
public DefaultHandler()
{
code = OperationType.Default;
}
public override void OnOperationRequest(ClientSession peer, OperationRequest operationRequest, SendParameters sendParameters)
{
}
}
}
5.分发消息
在ServerRoot.cs 中添加注册消息的调用方法
在ClientSession中添加分发消息的调用方法
- 在主目录下创建 MsgManager.cs , 脚本内容如下:
using System.Collections.Generic;
using Photon.SocketServer;
using Protocal;
namespace zclServer
{
public class MsgManager
{
#region 单例
private static MsgManager instance;
public static MsgManager Instance
{
get
{
if (instance == null)
{
instance = new MsgManager();
}
return instance;
}
}
#endregion
//处理所有客户端请求函数的集合
public Dictionary<OperationType, BaseHandler> HandlerDic = new Dictionary<OperationType, BaseHandler>();
public void RegisterHandler(BaseHandler baseHandler)
{
if (!HandlerDic.ContainsKey(baseHandler.code))
{
HandlerDic.Add(baseHandler.code, baseHandler);
}
}
public void RemoveHandler(BaseHandler baseHandler)
{
if (HandlerDic.ContainsKey(baseHandler.code))
{
HandlerDic.Remove(baseHandler.code);
}
}
//集中注册消息
public void InitRegister()
{
//这里以后写要注册的消息, 如:RegisterHandler(new DefaultHandler());
}
//分发消息
public void DispatchMsg(OperationRequest operationRequest, SendParameters sendParameters,ClientSession peer)
{
BaseHandler handler = DicManager.GetValue<OperationType, BaseHandler>(MsgManager.Instance.HandlerDic, (OperationType)operationRequest.OperationCode);
if (handler != null)
{
handler.OnOperationRequest(peer, operationRequest, sendParameters);
}
else
{
BaseHandler defaultHandler = DicManager.GetValue<OperationType, BaseHandler>(MsgManager.Instance.HandlerDic, OperationType.Default);
defaultHandler.OnOperationRequest(peer, operationRequest, sendParameters);
}
}
}
}
- 生成, 把生成的文件复制到deploy/ MyAPPServer/bin目录下
- 启动photonServer, 启动WingInstance
后面我们开发客户端: