/// <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); }
/// <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); }
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; } } }
/// <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); }
/// <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()); }
/// <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); }