/// <summary>解码</summary> /// <param name="context"></param> /// <param name="pk"></param> /// <returns></returns> protected override IList <Packet> Decode(IHandlerContext context, Packet pk) { var ss = context.Session; var mcp = ss["CodecItem"] as CodecItem; if (mcp == null) { ss["CodecItem"] = mcp = new CodecItem(); } return(Parse(pk, mcp, ms => GetLength(ms, Offset, Size), Expire)); }
/// <summary>解码</summary> /// <param name="context"></param> /// <param name="pk">包</param> /// <returns></returns> protected IList <Packet> Decode(IHandlerContext context, Packet pk) { var ss = context.Owner as IExtend; var mcp = ss["CodecItem"] as CodecItem; if (mcp == null) { ss["CodecItem"] = mcp = new CodecItem(); } var pks = Parse(pk, mcp, pk1 => GetLineLength(pk1)); return(pks); }
/// <summary>解码</summary> /// <param name="context"></param> /// <param name="pk"></param> /// <returns></returns> protected override IList<IMessage> Decode(IHandlerContext context, Packet pk) { var ss = context.Session; var mcp = ss["CodecItem"] as CodecItem; if (mcp == null) ss["CodecItem"] = mcp = new CodecItem(); var pks = Parse(pk, mcp, DefaultMessage.GetLength); var list = pks.Select(e => { var msg = new DefaultMessage(); if (!msg.Read(e)) return null; return msg as IMessage; }).ToList(); return list; }
/// <summary>解码</summary> /// <param name="context"></param> /// <param name="pk"></param> /// <returns></returns> protected override IList <Packet> Decode(IHandlerContext context, Packet pk) { var ss = context.Owner as IExtend; var mcp = ss["CodecItem"] as CodecItem; if (mcp == null) { ss["CodecItem"] = mcp = new CodecItem(); } var pks = Parse(pk, mcp, ms => GetLength(ms, Offset, Size), Expire); // 跳过头部长度 var len = Offset + Math.Abs(Size); foreach (var item in pks) { item.Set(item.Data, item.Offset + len, item.Count - len); //item.SetSub(len, item.Count - len); } return(pks); }
/// <summary>解码</summary> /// <param name="context"></param> /// <param name="pk"></param> /// <returns></returns> protected override IList <IMessage> Decode(IHandlerContext context, Packet pk) { var ss = context.Owner as IExtend; var mcp = ss["CodecItem"] as CodecItem; if (mcp == null) { ss["CodecItem"] = mcp = new CodecItem(); } var pks = Parse(pk, mcp, DefaultMessage.GetLength); var list = pks.Select(e => { var msg = new DefaultMessage(); if (!msg.Read(e)) { return(null); } return(msg as IMessage); }).ToList(); return(list); }
/// <summary>分析数据流,得到一帧数据</summary> /// <param name="pk">待分析数据包</param> /// <param name="codec">参数</param> /// <param name="getLength">获取长度</param> /// <param name="expire">缓存有效期</param> /// <returns></returns> protected virtual IList <Packet> Parse(Packet pk, CodecItem codec, Func <Packet, Int32> getLength, Int32 expire = 5000) { var _ms = codec.Stream; var nodata = _ms == null || _ms.Position < 0 || _ms.Position >= _ms.Length; var list = new List <Packet>(); // 内部缓存没有数据,直接判断输入数据流是否刚好一帧数据,快速处理,绝大多数是这种场景 if (nodata) { if (pk == null) { return(list.ToArray()); } var idx = 0; while (idx < pk.Total) { //var pk2 = new Packet(pk.Data, pk.Offset + idx, pk.Total - idx); var pk2 = pk.Slice(idx); var len = getLength(pk2); if (len <= 0 || len > pk2.Count) { break; } pk2.Set(pk2.Data, pk2.Offset, len); //pk2.SetSub(0, len); list.Add(pk2); idx += len; } // 如果没有剩余,可以返回 if (idx == pk.Total) { return(list.ToArray()); } // 剩下的 //pk = new Packet(pk.Data, pk.Offset + idx, pk.Total - idx); pk = pk.Slice(idx); } if (_ms == null) { codec.Stream = _ms = new MemoryStream(); } // 加锁,避免多线程冲突 lock (_ms) { // 超过该时间后按废弃数据处理 var now = TimerX.Now; if (_ms.Length > _ms.Position && codec.Last.AddMilliseconds(expire) < now) { _ms.SetLength(0); _ms.Position = 0; } codec.Last = now; // 合并数据到最后面 if (pk != null && pk.Total > 0) { var p = _ms.Position; _ms.Position = _ms.Length; pk.WriteTo(_ms); _ms.Position = p; } // 尝试解包 while (_ms.Position < _ms.Length) { //var pk2 = new Packet(_ms.GetBuffer(), (Int32)_ms.Position, (Int32)_ms.Length); var pk2 = new Packet(_ms); var len = getLength(pk2); // 资源不足一包 if (len <= 0 || len > pk2.Total) { break; } // 解包成功 pk2.Set(pk2.Data, pk2.Offset, len); //pk2.SetSub(0, len); list.Add(pk2); _ms.Seek(len, SeekOrigin.Current); } // 如果读完了数据,需要重置缓冲区 if (_ms.Position >= _ms.Length) { _ms.SetLength(0); _ms.Position = 0; } return(list); } }