我注意到,当我运行 dotnetty 的解码器时,它包含以前的数据。我不知道为什么,但第一个数据包(数据)通过得很好,客户端由于某种原因发送的第二个数据位包括数据的两部分,即先前处理的数据。
我检查了客户端,客户端没有发送它们,服务器只是接收它们,我觉得这是DotNetty正在做的事情?
internal class JsonToPacketDecoder : ByteToMessageDecoder
{
protected override void Decode(IChannelHandlerContext context, IByteBuffer input, List<object> output)
{
Console.WriteLine("Decoding: " + input.ToString(Encoding.UTF8) + " \n");
output.Add(new IncomingPacket(JObject.Parse(input.ToString(Encoding.UTF8)).ToFlatDictionary()));
}
}
似乎 input.ToString(Encoding.UTF8)
两者都包含?
最佳答案
发生此问题的原因是 ToString(Encoding)
在显示内容时不消耗任何输入字节。
这是为什么呢?这是因为“to string”函数的通常用例并不在实际读取字节重要的空间中,因为它基本上每次都会读取所有字节,即使已收到 2 个“数据包”。
toString 的实际用例将在处理程序内部,其中已经将数据包分组成适当的 block 。
您可能想要的是 DelimiterBasedFrameDecoder
将传入流拆分为由换行符或空字节分隔的数据包,然后使用 ChannelHandlerAdapter ,您可以在其中将数据包解码为 JSON。
关于c# - .NETTY : Second batch of data sent includes the first?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49785863/