//绑定操作类型到类并指定回调函数 internal static void Bind <T>() where T : BaseHandle { using (T tmp = (T)(Activator.CreateInstance(typeof(T), new byte[] { }))) { HandleEnum handle = tmp.type; HandleLengthMapDic[handle] = tmp.Used + tmp.Length; HandleDynamicMapDic[handle] = tmp.isDynamic; HandleRequestMapDic[handle] = tmp.isRequest; } }
//执行绑定映射的事件 public int Dispose(IPEndPoint origin, byte[] value) { //Debug.Log("[节点]"+ point.LocalEndPoint + "[来源]"+ origin + "[长度]" + value.Length); int count = 0; byte[] current; for (int i = 0; i < value.Length; i++) { //获取当前的操作 HandleEnum handle = FromByteToHandle(value, ref i, out current); //Debug.Log("获取操作"+handle+"当前委托"+ EnumActionMapDic[handle]); //调用映射的委托 DisposeHandle(origin, handle, current); count += 1; } return(count); }
//转为指令形式,从value中的current位置开始输出数组指令到array internal static HandleEnum FromByteToHandle(byte[] value, ref int current, out byte[] array) { //Debug.Log("当前位置"+current); HandleEnum handle = ByteToHandle(value, current); if (handle != HandleEnum.Null) //如果指令为空 { //验证值 //int verify = 0; //根据获取的类型值查询对应数组长度 int length = HandleLengthMapDic[handle]; //动态范围则需要加上其后续数据的长度 if (HandleDynamicMapDic[handle]) { length += value[current + 4] + (value[current + 5] << 8) + (value[current + 6] << 16) + (value[current + 7] << 24); } //if (HandleRequestMapDic[handle]) //{ // verify = value[current + 8] + (value[current + 9] << 8) + (value[current + 10] << 16) + (value[current + 11] << 24); // if (point.RetryDic.TryAdd(verify, TimeMgr.TickTime)) // { // Debug.Log("[有效请求]"+verify); // } //} array = new byte[length]; for (int i = 0; i < length; i++) { array[i] = value[current + i]; } //移动游标 current += length - 1; } else { handle = HandleEnum.Null; array = HandleToByteMapDic[HandleEnum.Null]; } return(handle); }
/// <summary> /// Initialize the corresponding file processing object. /// </summary> /// <typeparam name="TEntity">file entity</typeparam> /// <param name="handleEnum">handle enum</param> /// <returns>handle</returns> private IHandle <TEntity> InitHandle <TEntity>(HandleEnum handleEnum) where TEntity : class { IHandle <TEntity> handle = null; switch (handleEnum) { case HandleEnum.DB: handle = new DBHandle <TEntity>(); break; case HandleEnum.INI: handle = new IniHandle <TEntity>(); break; case HandleEnum.JSON: handle = new JsonHandle <TEntity>(); break; case HandleEnum.XML: handle = new XmlHandle <TEntity>(); break; } return(handle); }
private void DisposeHandle(IPEndPoint origin, HandleEnum handle, byte[] value) { switch (handle) { case HandleEnum.Connect: if (OnConnectHandle != null) { Dispose(point, origin, OnConnectHandle, value); } else { Console.WriteLine("未配置" + HandleEnum.Connect); } break; case HandleEnum.Message: if (OnMessageHandle != null) { Dispose(point, origin, OnMessageHandle, value); } else { Console.WriteLine("未配置" + HandleEnum.Message); } break; case HandleEnum.ReadBuffer: if (OnReadBufferHandle != null) { Dispose(point, origin, OnReadBufferHandle, value); } else { Console.WriteLine("未配置" + HandleEnum.ReadBuffer); } break; case HandleEnum.WriteBuffer: if (OnWriteBufferHandle != null) { Dispose(point, origin, OnWriteBufferHandle, value); } else { Console.WriteLine("未配置" + HandleEnum.WriteBuffer); } break; case HandleEnum.CmdData: if (OnCmdDataHandle != null) { Dispose(point, origin, OnCmdDataHandle, value); } else { Console.WriteLine("未配置" + HandleEnum.CmdData); } break; case HandleEnum.RequestData: if (OnRequestDataHandle != null) { Dispose(point, origin, OnRequestDataHandle, value); } else { Console.WriteLine("未配置" + HandleEnum.RequestData); } break; case HandleEnum.ReplyData: if (OnReplyDataHandle != null) { Dispose(point, origin, OnReplyDataHandle, value); } else { Console.WriteLine("未配置" + HandleEnum.ReplyData); } break; case HandleEnum.RequestCmd: if (OnRequestCmdHandle != null) { Dispose(point, origin, OnRequestCmdHandle, value); } else { Console.WriteLine("未配置" + HandleEnum.RequestCmd); } break; case HandleEnum.ReplyCmd: if (OnReplyCmdHandle != null) { Dispose(point, origin, OnReplyCmdHandle, value); } else { Console.WriteLine("未配置" + HandleEnum.ReplyCmd); } break; case HandleEnum.Inform: if (OnInformHandle != null) { Dispose(point, origin, OnInformHandle, value); } else { Console.WriteLine("未配置" + HandleEnum.Inform); } break; case HandleEnum.Null: Console.WriteLine("未配置" + HandleEnum.Null); break; } }