在我的 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 在这里做了什么。
谢谢你。