处理Netty中的消息

时间:2017-06-13 09:16:48

标签: java netty

我是Netty的新手,需要以自定义方式处理邮件。我有以下界面:

public interface Command{ }

public interface CommandFactory{
    Command(byte b)
}

public interface CommandProcessor{
    void process(Command c, Object arg)
}

现在我从客户端收到一些数据并想要处理它。我正在为此实施ReplayingDecoder<Void>

public class CommandDecoder extends ReplayingDecoder<Void>{
    private CommandFactory cmf;
    private CommandProcessor cmp;

   void decode(ChannelHandlerContext ctx, ByteBuf in, List<AnyRef> out){
       Command command = cmf.command (
         in.readByte()
       );

       String arg = new String (
         in.readBytes (
           in.readShort()
         ).array()
       );

      cmp.process(command, arg); //<------------ Here
  }
}

事情是我不确定。我在解码器内处理命令。至少可以说这看起来很奇怪。也许我应该将已解码的commmandarg进一步传递给channel pipeline

但是ChannelInboundHandler选择哪个命令处理?<​​/ p>

1 个答案:

答案 0 :(得分:2)

你是对的。最好将解码器和实际业务逻辑分开以进行命令处理。在这种情况下,最好的处理程序将是SimpleChannelInboundHandler。一般来说,它只接受特定类型的消息。

看起来像这样:

public class MyCommandHandler extends SimpleChannelInboundHandler<Command> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Command command) throws Exception {
         //process here your message
         //command.type;
         //command.args  
    }

}

所以你解码了命令之后:

Command command = cmf.command (
         in.readByte(),
         new String (in.readBytes (in.readShort()).array())
       );

您可以将其传递给管道中的下一个MyCommandHandler

out.add(command);