【问题标题】:Netty FrameDecoder instance stateNetty FrameDecoder 实例状态
【发布时间】:2013-01-30 15:51:27
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: netty


    【解决方案1】:

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

    【讨论】:

    • 我查看了 ReplayingDecoder,但我认为它不是我需要的。我正在阅读所有可用的字节并使用它们。我评估我刚刚读到的内容,如果它是一个完整的 PDU,那么我会返回我所拥有的。如果不是,那么我返回一个空值,下次返回时我添加新字节并再次评估。如果出现错误,我会抛出异常。
    • ReplayingDecoder 实现将回答您的问题“我不确定当我再次回到 decode() 时我处于什么状态”。
    • 好的,我知道它可以让我方便地保存有关我的处理的状态信息,并且不会大惊小怪。谢谢你的帮助。
    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2016-06-17
    • 2018-05-01
    • 1970-01-01
    相关资源
    最近更新 更多