Ejemplo n.º 1
0
    /// <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);
        }
    }
Ejemplo n.º 2
0
    /// <summary>
    /// 根据协议号获取发包成员列表
    /// </summary>
    public List <object> GetProtocolPackMemberListByProtocolNo(ProtocolNo protocolNo)
    {
        List <object> list = null;

        protocolPackMemberDict.TryGetValue(protocolNo, out list);
        return(list);
    }
Ejemplo n.º 3
0
 //通用发包方法
 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());
     }
 }
Ejemplo n.º 4
0
        /// <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!");
            }
        }
Ejemplo n.º 5
0
 /// <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);
 }
Ejemplo n.º 6
0
 /// <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);
 }