/// <summary> /// 通用解包方法 需保证bytes数组完整性 /// </summary> public object StartUnPack(ref byte[] bytes, ref ProtocolEventType type) { if (bytes.Length <= 12) { return(null); } int dataCount = ProtocolUtility.UnPackInt(ref bytes); //数据长度 type = (ProtocolEventType)ProtocolUtility.UnPackInt(ref bytes); //事件类型 ProtocolNo protoNo = (ProtocolNo)ProtocolUtility.UnPackInt(ref bytes); //协议号 object protocolObject = null; protocolObjectDict.TryGetValue(protoNo, out protocolObject); if (protocolObject != null) { List <object> list = GetProtocolUnPackMemberListByProtocolNo(protoNo); //协议解包类结构如:{int,string,class} List <object> unPackObjectList = new List <object>(); CommonUnPack(ref bytes, list, ref unPackObjectList); //开始递归解包 ((ProtocolData)protocolObject).SetData(unPackObjectList); return(((ProtocolData)protocolObject).Clone()); } else { Debug.LogError("protocolNo" + protoNo + ",not exist protocolObject in protocolObjectDict!"); return(null); } }
/// <summary> /// 根据协议号获取发包成员列表 /// </summary> public List <object> GetProtocolPackMemberListByProtocolNo(ProtocolNo protocolNo) { List <object> list = null; protocolPackMemberDict.TryGetValue(protocolNo, out list); return(list); }
//通用发包方法 public void SendRequest(ProtocolNo protocolNo, ProtocolEventType type, Client client, params object[] objectArr) { try { if (objectArr.Length <= 0) { throw new Exception("参数列表为空!"); } //根据协议号获取发包成员列表 List <object> packMemberList = GetProtocolPackMemberListByProtocolNo(protocolNo); if (packMemberList.Count != objectArr.Length) { throw new Exception(protocolNo + "协议发包成员个数与规定个数不符合!"); } //查看是否满足协议发包成员列表的顺序 for (int i = 0; i < packMemberList.Count; i++) { if (packMemberList[i].GetType() != objectArr[i].GetType() && packMemberList[i].GetType() != objectArr[i].GetType().BaseType) { throw new Exception(protocolNo + "协议发包成员有误!具体为第" + i + 1 + "个成员类型应为" + packMemberList[i].GetType() + ",而不是" + objectArr[i].GetType()); } } byte[] bytes = null; CommonPack(ref bytes, objectArr.ToList()); //协议号字节数组 byte[] dataBytes = BitConverter.GetBytes((int)protocolNo); //事件ID字节数组 byte[] eventIDBytes = BitConverter.GetBytes((int)type); client.SendResponse(eventIDBytes.Concat(dataBytes.Concat(bytes).ToArray()).ToArray()); } catch (Exception e) { throw new Exception(e.ToString()); } }
/// <summary> /// 通用解包方法 需保证bytes数组完整性 /// </summary> public object StartUnPack(ref byte[] bytes, ref ProtocolEventType type) { if (bytes.Length <= 12) { return(null); } int dataCount = ProtocolUtility.UnPackInt(ref bytes); //数据长度 type = (ProtocolEventType)ProtocolUtility.UnPackInt(ref bytes); //事件类型 ProtocolNo protoNo = (ProtocolNo)ProtocolUtility.UnPackInt(ref bytes); //协议号 object protocolObject = null; protocolObjectDict.TryGetValue(protoNo, out protocolObject); if (protocolObject != null) { List <object> list = GetProtocolUnPackMemberListByProtocolNo(protoNo); List <object> unPackObjectList = new List <object>(); //递归通用解析(即遇到是类结构的成员会继续解析该类成员),所有的数据会被会解析出来并放入List<object>第三个参数 CommonUnPack(ref bytes, list, ref unPackObjectList); //多线程时要加锁!这个缓存的protocolObject协议对象仅仅是为了拷贝 only for copy!when multiple thread, it must be locked! ((ProtocolData)protocolObject).SetData(unPackObjectList); //深拷贝方式 deepCopy method(way) return(((ProtocolData)protocolObject).Clone()); } else { throw new Exception("protocolNo" + protoNo + ",not exist protocolObject in protocolObjectDict!"); } }
/// <summary> /// 添加协议封包成员列表 /// </summary> /// <param name="protocolNo">协议号</param> /// <param name="objectList">封包成员列表</param> public void AddProtocolPackMemberListToDict(ProtocolNo protocolNo, List <object> objectList) { if (protocolPackMemberDict.ContainsKey(protocolNo)) { return; } protocolPackMemberDict.Add(protocolNo, objectList); }
/// <summary> /// 添加协议解包成员列表 /// </summary> /// <param name="protocolNo">协议号</param> /// <param name="objectList">解包成员列表</param> public void AddProtocolObjectToDict(ProtocolNo protocolNo, object o) { if (protocolObjectDict.ContainsKey(protocolNo)) { return; } protocolObjectDict.Add(protocolNo, o); }