/// <summary> /// 将接收到的字节转成数据包 /// </summary> /// <param name="packs">数据包列表</param> /// <param name="e">接收数据</param> /// <param name="littleEndian">小端</param> /// <param name="maxPackageSize">最大包大小</param> /// <returns>数据包数 -1为非法数据包</returns> public IList <INetPackage> Parse(AsyncSocketTokenEventArgs e, bool littleEndian = true, int maxPackageSize = 10240) { //lock (((ICollection)lockers).SyncRoot) { } if (!lockers.ContainsKey(e.ConnectionID)) { lockers[e.ConnectionID] = new object(); } lock (lockers[e.ConnectionID]) { if (cache.ContainsKey(e.ConnectionID)) { cache[e.ConnectionID] = EndianHelper.UnionBytes(cache[e.ConnectionID], e.ReceivedBytes); } else { cache[e.ConnectionID] = EndianHelper.UnionBytes(null, e.ReceivedBytes); } byte[] data = cache[e.ConnectionID]; int count = data.Length; if (count <= 4) { return(new List <INetPackage>()); } if (count > maxPackageSize) { return(null); } IList <INetPackage> packs = new List <INetPackage>(); while (count > 4) { using (System.IO.MemoryStream stream = new System.IO.MemoryStream(data)) { StreamReader reader = new StreamReader(stream, littleEndian); int length = reader.ReadInt(); if (length > 0 && count >= length + 4) { INetPackage package = new SerializePackage(); byte[] result = new byte[length]; System.IO.MemoryStream resultStream = new System.IO.MemoryStream(result); stream.Position = 4; stream.Read(result, 0, length); package.Stream = new StreamReader(resultStream, littleEndian); package.Command = package.Stream.ReadInt(); data = new byte[count - length - 4]; stream.Position = length + 4; stream.Read(data, 0, count - length - 4); cache[e.ConnectionID] = data; packs.Add(package); count = count - length - 4; } else { if (length < 0) { cache[e.ConnectionID] = null; } return(packs); } } } return(packs); } }
/// <summary> /// 将接收到的字节转成数据包 /// </summary> /// <param name="packs">数据包列表</param> /// <param name="e">接收数据</param> /// <param name="littleEndian">小端</param> /// <param name="maxPackageSize">最大包大小</param> /// <returns>数据包数 -1为非法数据包</returns> public IList <INetPackage> Parse(AsyncSocketTokenEventArgs e, bool littleEndian = true, int maxPackageSize = 10240) { //lock (((ICollection)lockers).SyncRoot) {} if (!lockers.ContainsKey(e.ConnectionID)) { lockers[e.ConnectionID] = new object(); } lock (lockers[e.ConnectionID]) { if (cache.ContainsKey(e.ConnectionID)) { cache[e.ConnectionID] = EndianHelper.UnionBytes(cache[e.ConnectionID], e.ReceivedBytes); } else { cache[e.ConnectionID] = EndianHelper.UnionBytes(null, e.ReceivedBytes); } byte[] data = cache[e.ConnectionID]; int count = data.Length; if (count <= 4) { return(new List <INetPackage>()); } if (count > maxPackageSize) { return(null); } IList <INetPackage> packs = new List <INetPackage>(); while (count > 4) { byte[] lenBytes = new byte[4]; Buffer.BlockCopy(data, 0, lenBytes, 0, 4); StructPackageLength lenPack = EndianHelper.BytesToStruct <StructPackageLength>(lenBytes); int length = lenPack.Size; if (length > 0 && count >= length + 14) { byte[] bytes = new byte[10240 + 10 + 4]; Buffer.BlockCopy(data, 0, bytes, 0, length + 14); StructPackageData packData = EndianHelper.BytesToStruct <StructPackageData>(bytes); byte[] resultBytes = new byte[packData.Size]; Buffer.BlockCopy(packData.Bytes, 0, resultBytes, 0, packData.Size); System.IO.MemoryStream resultStream = new System.IO.MemoryStream(resultBytes); StructPackage pack = new StructPackage(); pack.Command = packData.Command; pack.Stream = new StreamReader(resultStream, littleEndian); packs.Add(pack); byte[] data2 = new byte[count - length - 14]; Buffer.BlockCopy(data, length + 14, data2, 0, count - length - 14); count = count - length - 14; data = data2; cache[e.ConnectionID] = data; } else { if (length < 0) { cache[e.ConnectionID] = null; } return(packs); } } return(packs); } }