PhotonServer教程《五》

服务器如何分发消息和处理消息

  1. 创建一个协议项目 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,
       
    }


}

  1. 在协议项目主目录下,创建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);
            }
        }
    }
}

  1. 在服务器项目中,添加项目对协议项目的引用:
    在这里插入图片描述
  2. 封装处理消息的类:
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中添加分发消息的调用方法
在这里插入图片描述
在这里插入图片描述

  1. 在主目录下创建 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);
            }
        }
    }
}

  1. 生成, 把生成的文件复制到deploy/ MyAPPServer/bin目录下
  2. 启动photonServer, 启动WingInstance

后面我们开发客户端:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值