如何在Netty 4中添加头部和尾部Delimiter帧解码器?

时间:2016-05-23 13:44:18

标签: netty

我刚刚开始在Netty 4上编码,发现它似乎只支持单数Delimiter,即使它声称支持多个分隔符。事实是它支持交替使用多个分隔符而不是同时使用。

我需要头部和尾部分隔符的原因是为了在丢包或接收到无序数据包的情况下提高速度。 例如。我的框架看起来像这样:$ _ {LEN} {DATA} \ r \ n

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

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

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

在我看来,Netty FrameDecoder设计没有考虑到数据包丢失或打包器无序的情况?对于Netty,我可能错了。如果有人可以让我了解这一点,请好心。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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