Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Netty如何使用ByteToMessageCodec?_Java_Netty - Fatal编程技术网

Java Netty如何使用ByteToMessageCodec?

Java Netty如何使用ByteToMessageCodec?,java,netty,Java,Netty,我的意图是为我的每条消息创建一个编解码器子类。例如,我有一个握手消息,所以我有一个用于所述握手消息的编解码器。我有另一个具体的消息,与它自己的具体编解码器一起 消息的头以一个操作码开始,我想知道,如果我不告诉Netty如何确定字节缓冲区,Netty怎么知道使用什么编解码器来解码字节缓冲区 我想了几种方法,但似乎没有一种是有意义的。我是否需要生成某种包含解析头和未解析体的中间原始消息 但问题仍然存在,我如何选择使用什么编解码器来解码身体?我是手动执行此操作(例如使用编解码器实例数组,这对我来说没有

我的意图是为我的每条消息创建一个编解码器子类。例如,我有一个握手消息,所以我有一个用于所述握手消息的编解码器。我有另一个具体的消息,与它自己的具体编解码器一起

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

我想了几种方法,但似乎没有一种是有意义的。我是否需要生成某种包含解析头和未解析体的中间原始消息


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

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

在将处理程序添加回管道时,我是否可以继续使用相同的处理程序实例?将会有很多消息被处理,我不知道每次收到消息时实例化新的东西是否明智。也许在某种类型的switch/if列表中为所有类型的消息使用一个大处理程序更明智。或者在每个消息类中进行解码/编码。我不知道使用Netty的首选模式:(您可以使用相同的处理程序实例,只要它们是可共享的(即它们不保持状态)。它们还需要用@ChannelHandler.Sharable进行注释才能进行验证。我已经对此进行了测试,但我不希望在管道上为每条消息删除/替换/添加处理程序。我决定只为标头设置一个编解码器,然后设置一个处理程序来确定操作码映射到的消息类,然后发送消息缓冲到该实例化消息。