Ejemplo n.º 1
0
        /// <summary>
        /// 处理收到的包
        /// </summary>
        private void ProcessReceviedPackage()
        {
            CMessage message = null;

            while ((message = m_Receiver.PopReadyToHandlerPackage()) != null)
            {
                // 如果是伪造的消息,则创建时会导致读写位置到包的末尾了
                // 因此需要在这里重置归0
                message.Body.ResetPosition();

                // 包ID
                int OpCode = message.OpCode;

                // 反射出类型
                Type type = CPackageManager.Instance.ReflectionClassNameByActionID(OpCode);

                //安全处理
                if (type == null)
                {
                    CLOG.E("Reflection class name by OpCode error! OpCode={0} reflection class name = null!! please check the code", OpCode);
                    return;
                }

                // 得到该类型的处理委托
                DelegatePackageHandler DP = CPackageManager.Instance.GetPackageHandler(type);

                // 创建反射类型实例
                CPackageBase package = Activator.CreateInstance(type) as CPackageBase;

                //安全处理
                if (package == null)
                {
                    CLOG.E("create package instance error! OpCode = {0} type = {1}", OpCode, type.ToString());
                    return;
                }

                // 从message的身体中获取数据实例化对象
                try
                {
                    package.FromMessage(ref message);
                }
                catch (Exception ex)
                {
                    CLOG.E("from message error! Exception!! OpCode = {0} type={1} message={2} ", OpCode, type.ToString(), message.ToString());
                    CLOG.E(ex.ToString());
                    return;
                }

                // 调用委托,传入参数
                if (DP != null)
                {
                    DP(package);
                }
                else
                {
                    CLOG.W("ths OpCode {0} was not register handler!", OpCode);
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 移除一个消息包的指定委托
        /// </summary>
        /// <param name="clsType">消息包类型</param>
        /// <param name="Handler">指定委托</param>
        public void RemovePackageHandler(Type clsType, DelegatePackageHandler Handler)
        {
            if (!m_PackageHandlerDic.ContainsKey(clsType))
            {
                return;
            }

            m_PackageHandlerDic[clsType] -= Handler;
        }
Ejemplo n.º 3
0
 /// <summary>
 /// 注册网络消息处理包
 /// </summary>
 /// <param name="clsType">类型</param>
 /// <param name="Handler">处理函数</param>
 public void AddPackageHandler(Type clsType, DelegatePackageHandler Handler)
 {
     if (!m_PackageHandlerDic.ContainsKey(clsType))
     {
         m_PackageHandlerDic[clsType] = Handler;
     }
     else
     {
         m_PackageHandlerDic[clsType] += Handler;
     }
 }
Ejemplo n.º 4
0
 /// <summary>
 /// 给一个消息包重设一个新的处理委托
 /// 该操作相当于
 /// RemovePackageHandler( clsType );
 ///  AddPackageHandler( clsType, handler );
 /// </summary>
 /// <param name="clsType">网络包类型</param>
 /// <param name="Handler">处理委托</param>
 public void ResetPackageHandler(Type clsType, DelegatePackageHandler Handler)
 {
     RemovePackageHandler(clsType);
     AddPackageHandler(clsType, Handler);
 }
Ejemplo n.º 5
0
 /// <summary>
 /// 移除指定消息包的指定处理委托
 /// </summary>
 /// <param name="clsType">消息包类型</param>
 /// <param name="handler">处理委托</param>
 public void RemovePackageHandler(Type clsType, DelegatePackageHandler handler)
 {
     CPackageManager.Instance.RemovePackageHandler(clsType, handler);
 }