Java Netty如何使用ByteToMessageCodec?
我的意图是为我的每条消息创建一个编解码器子类。例如,我有一个握手消息,所以我有一个用于所述握手消息的编解码器。我有另一个具体的消息,与它自己的具体编解码器一起 消息的头以一个操作码开始,我想知道,如果我不告诉Netty如何确定字节缓冲区,Netty怎么知道使用什么编解码器来解码字节缓冲区 我想了几种方法,但似乎没有一种是有意义的。我是否需要生成某种包含解析头和未解析体的中间原始消息Java Netty如何使用ByteToMessageCodec?,java,netty,Java,Netty,我的意图是为我的每条消息创建一个编解码器子类。例如,我有一个握手消息,所以我有一个用于所述握手消息的编解码器。我有另一个具体的消息,与它自己的具体编解码器一起 消息的头以一个操作码开始,我想知道,如果我不告诉Netty如何确定字节缓冲区,Netty怎么知道使用什么编解码器来解码字节缓冲区 我想了几种方法,但似乎没有一种是有意义的。我是否需要生成某种包含解析头和未解析体的中间原始消息 但问题仍然存在,我如何选择使用什么编解码器来解码身体?我是手动执行此操作(例如使用编解码器实例数组,这对我来说没有
但问题仍然存在,我如何选择使用什么编解码器来解码身体?我是手动执行此操作(例如使用编解码器实例数组,这对我来说没有意义),然后像
codecs[opcode]
那样访问,还是Netty有什么东西可以为我进行此选择?通常的模式是在管道中有一个操作码解码处理程序。一旦解码器读取操作码并确定操作码映射到哪个消息处理程序,它就会将映射的消息处理程序添加到管道并删除自身。完成(或失败)后,操作码解码处理程序将被添加回管道,先前的消息处理程序将被删除。在将处理程序添加回管道时,我是否可以继续使用相同的处理程序实例?将会有很多消息被处理,我不知道每次收到消息时实例化新的东西是否明智。也许在某种类型的switch/if列表中为所有类型的消息使用一个大处理程序更明智。或者在每个消息类中进行解码/编码。我不知道使用Netty的首选模式:(您可以使用相同的处理程序实例,只要它们是可共享的(即它们不保持状态)。它们还需要用@ChannelHandler.Sharable进行注释才能进行验证。我已经对此进行了测试,但我不希望在管道上为每条消息删除/替换/添加处理程序。我决定只为标头设置一个编解码器,然后设置一个处理程序来确定操作码映射到的消息类,然后发送消息缓冲到该实例化消息。