0

在我的 Netty 代码中,我正在编写一个 FrameDecoder 来处理 LDAP PDU。我有代码可以让我确定 PDU 是否完整(状态为PDU_DECODED)或是否需要更多数据(VALUE_STATE_PENDING)。另外,我还可以检测到更多错误情况。

在大多数情况下,我认为一次读取将获得整个 PDU。但是对于那些我需要再次读取以获取更多数据的时候,我想知道最好的编码方式。

现在在我的decode()我正在标记阅读器索引,buf.markReaderInded()读取可用字节,检查读取的字节以查看它是否是有效的 PDU。如果是,我返回读取的字节。如果不是,那么我重置阅读器索引,buf.resetReaderIndex()然后返回 null。下次我回来时,decode()我将获得原始数据加上下一次读取的数据。我可以再次运行检查。

但我想存储第一次读取的原始数据,并在下一次读取时获取 PDU 的其余部分(或下一部分)。然后我会将该数据添加到我已经存储在我的帧解码器实例中的数据中,并检查它是否是有效的 PDU。这次我不会对阅读器索引进行重置buf.resetReaderIndex(),而只是返回了一个空值。

顺便说一句,我已经在使用setAttachment()/getAttachment()将信息存储在ChannelHandlerContext. 所以我不能用那个。我在建立连接时设置它。

当我再次回到 decode() 时,我不确定自己处于什么状态。它是同一个实例还是我FrameDecoder班级的新实例?我可以在可用之前定义和设置变量吗?我不确定 Netty 在这里做了什么。

谢谢你。

4

1 回答 1

1

听起来你需要 Netty ReplayingDecoder。您基本上将解码步骤或检查点定义为enum中的成员。您在第一次调用对象时开始读取,一旦您过度读取缓冲区,netty 会自动“等待”更多传入数据并在收到一些数据时重播。一旦你到达一个已知的检查点,你就将解码器转换到下一个状态。当 netty 调用解码器时,它会传递最后一个已知状态,所以你总是知道你在哪里。它非常适合处理复杂的对象,和/或解码中有条件分支的地方。这里有一个很好的教程。

于 2013-01-30T19:09:49.190 回答