如何在Netty 4中添加头和尾分隔符帧解码器



我刚开始在Netty 4上编码,发现它似乎只支持单数分隔符,尽管它声称支持多个分隔符。事实上,它支持可互换地使用多个分隔符,而不是同时使用。

我需要头和尾分隔符的原因是为了在出现数据包丢失或接收到的数据包不正常的情况下提高速度。例如,我的帧看起来像这样:$_{LEN}{DATA}\r\n

所以我的头分隔符是$_,而尾分隔符是\r\n。

假设在一帧中接收到多个数据包,而一些中间数据包在传输过程中丢失,如果没有$,解码器必须继续搜索\r\n以确定结束。如果\r\n也丢失了,那么它必须搜索下一个消息,\r\n而不是点击导致新消息的$。。。

但现有的Netty DelimiterBasedFrameDecoder似乎无法支持我上面想要的。我应该如何实现自己的目标?

在我看来,Netty FrameDecoder的设计没有考虑到数据包丢失或打包器无序的情况?我可能对内蒂说错了。如果有人能告诉我这件事,请帮忙。

为了简洁高效,我最终使用了Netty的LengthFieldBasedFrameDecoder,这对客户端和服务器端的数据包帧解码都很重要。我的消息格式如下:\r\n$LEN$DATA\r\n$LEN$DATA

ChannelPipeline p = ch.pipeline();
p.addLast(new LengthFieldBasedFrameDecoder(1024,2,4,0,6)); 

根据客户端环境的不同,Netty库可能用于也可能不用于客户端连接和通信。但有了这种消息结构,它总是可以在编写相对稳健和高效的帧解码代码时轻松实现。

我认为DelimiterFrameDecoder假设一个无损有序输入流。如果管道中的较低级别传输层不是无损有序连接,那么您将需要实现自己的帧解码器,通过实现校验和和和帧ID或其他协议策略来处理丢失的数据和无序帧。

相关内容

最新更新