/// <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); } } }
/// <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; }
/// <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; } }
/// <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); }
/// <summary> /// 移除指定消息包的指定处理委托 /// </summary> /// <param name="clsType">消息包类型</param> /// <param name="handler">处理委托</param> public void RemovePackageHandler(Type clsType, DelegatePackageHandler handler) { CPackageManager.Instance.RemovePackageHandler(clsType, handler); }