示例#1
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;

            if (ss["Codec"] is not PacketCodec pc)
            {
                ss["Codec"] = pc = new PacketCodec
                {
                    GetLength = DefaultMessage.GetLength,
                    Tracer    = (context.Owner as ISocket)?.Tracer
                };
            }

            var pks  = pc.Parse(pk);
            var list = pks.Select(e =>
            {
                var msg = new DefaultMessage();
                if (!msg.Read(e))
                {
                    return(null);
                }

                return(msg as IMessage);
            }).ToList();

            return(list);
        }
示例#2
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 pc = ss["Codec"] as PacketCodec;

            if (pc == null)
            {
                ss["Codec"] = pc = new PacketCodec {
                    GetLength = DefaultMessage.GetLength
                }
            }
            ;

            var pks  = pc.Parse(pk);
            var list = pks.Select(e =>
            {
                var msg = new DefaultMessage();
                if (!msg.Read(e))
                {
                    return(null);
                }

                return(msg as IMessage);
            }).ToList();

            return(list);
        }
示例#3
0
        async Task DiscoverUdp(IPAddress local, IPEndPoint ep)
        {
            XTrace.WriteLine("DiscoverUdp: {0} -> {1}", local, ep);

            // 构建请求
            var enc = new JsonEncoder();
            var msg = enc.CreateRequest("Api/Info", null);
            var req = msg.ToPacket().ReadBytes();

            var udp = new UdpClient(ep.AddressFamily)
            {
                EnableBroadcast = true
            };

            if (local != null)
            {
                udp.Client.Bind(new IPEndPoint(local, Rand.Next(1000, 60000)));
            }

            // 发送
            udp.Send(req, req.Length, ep);

            // 多次接收
            while (true)
            {
                try
                {
                    var source = new CancellationTokenSource(3_000);
                    var rs     = await udp.ReceiveAsync(source.Token);

                    if (rs.Buffer != null)
                    {
                        msg = new DefaultMessage();
                        msg.Read(rs.Buffer);

                        if (enc.Decode(msg, out var action, out var code, out var data) && code == 0)
                        {
                            // 解码结果
                            var result = enc.DecodeResult(action, data, msg);
                            XTrace.WriteLine("Receive[{0}] {1}", udp.Client.LocalEndPoint, result.ToJson());

                            var ai = enc.Convert(result, typeof(ApiItem)) as ApiItem;
                            if (ai != null)
                            {
                                Invoke(() => ShowItem(ai));
                            }
                        }
                    }
                }
                catch (OperationCanceledException)
                {
                    break;
                }
            }
        }
示例#4
0
        /// <summary>加载消息</summary>
        /// <param name="pk"></param>
        /// <returns></returns>
        public override IMessage LoadMessage(Packet pk)
        {
            if (pk == null || pk.Count == 0)
            {
                return(null);
            }

            var msg = new DefaultMessage();

            msg.Read(pk);

            return(msg);
        }
示例#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.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;
        }
        public void BinaryEncode()
        {
            var msg = new DefaultMessage
            {
                Sequence = 1,
                Payload  = "Open".GetBytes(),
            };
            var pk = msg.ToPacket();

            Assert.Equal(1, pk[0]);
            Assert.Equal(1, pk[1]);
            Assert.Equal(4, pk[2]);
            Assert.Equal(0, pk[3]);
            Assert.Equal("Open", pk.Slice(4).ToStr());

            var msgd = new DefaultMessage();
            var rs   = msgd.Read(pk);

            Assert.True(rs);
            Assert.Equal(msg.Flag, msgd.Flag);
            Assert.Equal(msg.Sequence, msgd.Sequence);
            Assert.Equal(msg.Payload.ToStr(), msgd.Payload.ToStr());

            var msg2 = new DefaultMessage
            {
                Reply    = true,
                Sequence = 1,
                Payload  = "执行成功".GetBytes(),
            };
            var pk2 = msg2.ToPacket();

            Assert.Equal(0x81, pk2[0]);
            Assert.Equal(1, pk2[1]);
            Assert.Equal(12, pk2[2]);
            Assert.Equal(0, pk2[3]);
            Assert.Equal("执行成功", pk2.Slice(4).ToStr());

            var msgd2 = new DefaultMessage();
            var rs2   = msgd2.Read(pk2);

            Assert.True(rs2);
            Assert.Equal(msg2.Flag, msgd2.Flag);
            Assert.Equal(msg2.Sequence, msgd2.Sequence);
            Assert.Equal(msg2.Payload.ToStr(), msgd2.Payload.ToStr());
        }
示例#7
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);
        }