2017-06-13 88 views
2

我是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可供选择用于命令处理?

回答

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 
    } 

} 

所以你解码你的命令后:

out.add(command); 

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

你可以把它在管道与传递到下一MyCommandHandler