Esempio n. 1
0
        public override void channelRead(HandlerContext ctx, object msg)
        {
            try
            {
                var    ip     = (ctx.Socket.RemoteEndPoint as IPEndPoint);
                var    key    = ip.Address.ToString() + ip.Port;
                Packet packet = (Packet)msg;

                var segment = packet.Segment;
                //处理分包
                if (segment.Divide)
                {
                    segmentCache.TryAdd(key, new List <Segment>());
                    segmentCache[key].Add(segment);

                    if (segmentCache[key].Count == segment.PNUM)
                    {
                        List <Segment> segments;
                        if (segmentCache.TryRemove(key, out segments))
                        {
                            var         orderList   = segments.OrderBy(o => o.PNO);
                            var         data        = string.Join("", orderList.Select(o => o.DataSegStr));
                            DataSegment dataSegment = DataSegment.FromStr(data);
                            segment.DataSegment = dataSegment;
                            Pipeline.Pipe(ctx, packet);
                        }
                    }
                }
                else
                {
                    Pipeline.Pipe(ctx, packet);
                }
            }catch (Exception e)
            {
                if (Log != null)
                {
                    Log.Error("SegmentHandle Error:", e);
                }
            }
        }