【问题标题】:Netty how to use ByteToMessageCodec?Netty如何使用ByteToMessageCodec?
【发布时间】:2017-06-30 09:46:12
【问题描述】:

我的目的是为我拥有的每条消息创建一个编解码器子类。例如,我有一个握手消息,所以我会有一个用于所述握手消息的编解码器。我有另一个具体的消息,伴随着它自己的具体编解码器。

消息的标头以操作码开头,我想知道,如果我不告诉它如何确定,Netty 怎么知道使用什么编解码器来解码字节缓冲区?

我想了几个方法,但似乎没有一个有意义。我是否需要制作某种包含已解析标头和未解析正文的中间粗略消息?

但是问题仍然存在,我如何选择使用什么编解码器来解码正文?我是否手动执行此操作(例如使用我的编解码器实例数组,这对我来说没有意义)然后我会像 codecs[opcode] 一样访问,还是 Netty 有什么东西可以为我做出这个选择?

【问题讨论】:

    标签: java netty


    【解决方案1】:

    通常的模式是在管道中有一个操作码解码处理程序。一旦解码器读取操作码并确定操作码映射到哪个消息处理程序,它将映射的消息处理程序添加到管道并删除自己。完成(或失败)后,操作码解码处理程序将重新添加到管道中,并删除先前的消息处理程序。

    【讨论】:

    • 在将处理程序添加回管道时,我可以继续使用相同的处理程序实例吗?会处理很多消息,我不知道每次收到消息时都实例化新东西是否明智。也许更明智的做法是在某种 switch/if-list 中为所有类型的消息设置一个大型处理程序。或者在每个消息类中进行解码/编码。我不知道 Netty 使用的首选模式:(
    • 您可以使用相同的处理程序实例,只要它们是可共享的(即它们不保持状态)。它们还需要使用 @ChannelHandler.Sharable 进行注释以证明这一点。
    • 我一直在对此进行测试,但我不喜欢我应该在每条消息中删除/替换/添加管道上的处理程序。我决定我只需要一个编解码器用于标头,然后是一个处理程序来确定操作码映射到哪个消息类,然后将缓冲区发送到该实例化消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2011-07-25
    • 1970-01-01
    • 2020-01-16
    • 2016-12-21
    相关资源
    最近更新 更多