Пример #1
0
        /// <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));
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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;
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
        /// <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);
            }
        }