Netty 当通道激活时,我如何区分两种类型的协议?

Netty 当通道激活时,我如何区分两种类型的协议?,netty,Netty,我使用的是4.0.4版本。在我的项目中有两种类型的协议。一个是消息,另一个是命令 我通过引用portunification示例成功地区分了它们。但是我发现区分逻辑是在decode方法中编码的。这意味着我只能先发一条信息来识别他们。下面是代码: @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { if

我使用的是4.0.4版本。在我的项目中有两种类型的协议。一个是消息,另一个是命令

我通过引用
portunification
示例成功地区分了它们。但是我发现区分逻辑是在
decode
方法中编码的。这意味着我只能先发一条信息来识别他们。下面是代码:

@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in,
        List<Object> out) throws Exception {
    if (in.readableBytes() < 4) {
        return;
    }
    int identifier = in.getUnsignedByte(in.readerIndex());
    if(identifier == 'C') {
        switchToCommand(ctx);
    } else {
        switchToMessage(ctx);
    }
}
private void switchToCommand(ChannelHandlerContext ctx) {
        ChannelPipeline p = ctx.pipeline();
        p.addLast(new CommandHandler());
        p.remove(this);
}

private void switchToMessage(ChannelHandlerContext ctx) {
        ChannelPipeline p = ctx.pipeline();
        p.addLast(new MessageHandler());

}
@覆盖
受保护的无效解码(ChannelHandlerContext ctx、ByteBuf in、,
列出)抛出异常{
if(in.readableBytes()<4){
返回;
}
int identifier=in.getUnsignedByte(in.readerIndex());
如果(标识符='C'){
切换到命令(ctx);
}否则{
交换信息(ctx);
}
}
专用void switchToCommand(ChannelHandlerContext ctx){
ChannelPipeline p=ctx.pipeline();
p、 addLast(newcommandhandler());
p、 移除(此);
}
专用void switchToMessage(ChannelHandlerContext ctx){
ChannelPipeline p=ctx.pipeline();
p、 addLast(newmessagehandler());
}
更糟糕的是,它无法在我的
CommandHandler
MessageHandler
中触发
channelActive
事件。我认为
channelRegistered
也不起作用

当通道被激活时,有没有办法区分它们?或者我应该如何处理我的场景?因为我想在
channelActive
中执行一些操作,例如发送欢迎消息或将频道添加到组中。
谢谢

如果不先读取一些数据,就无法检测协议。。。你会怎么做


您应该使用ctx.fireUserEventTriggered(..)并传入您自己的事件来通知ChannelPipeline中的其他处理程序检测到的协议。然后,处理程序可以覆盖userEventTriggered(..)并对其进行处理。

是否要在不检查数据的情况下确定协议类型?这可能是猜测,也可能是魔术。谢谢你的回答。但这对我来说可能很难。我更喜欢遵循netty提供的事件处理。