Netty FrameDecoder实例状态

时间:2013-01-30 15:51:27

标签: netty

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

在大多数情况下,我认为一次读取将获得整个PDU。但是,当我需要另一次读取以获取更多数据时,我想知道编码它的最佳方法。

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

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

顺便说一下,我已使用setAttachment() / getAttachment()ChannelHandlerContext中存储信息。所以我不能用它。我在连接时设置它。

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

谢谢。

1 个答案:

答案 0 :(得分:1)

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