在 Netty 中处理消息
Handling message in 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
}
}
问题是我不确定。我在解码器中处理命令。至少可以说这看起来很奇怪。也许我应该将解码后的 commmand
和 arg
进一步传递给 channel pipeline
。
但是选择哪个 ChannelInboundHandler
进行命令处理?
你是对的。最好将解码器和命令处理的实际业务逻辑分开。在这种情况下,最好的处理程序是 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);
我是 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
}
}
问题是我不确定。我在解码器中处理命令。至少可以说这看起来很奇怪。也许我应该将解码后的 commmand
和 arg
进一步传递给 channel pipeline
。
但是选择哪个 ChannelInboundHandler
进行命令处理?
你是对的。最好将解码器和命令处理的实际业务逻辑分开。在这种情况下,最好的处理程序是 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);