0

我使用的是 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());

}

更糟糕的是它无法触发channelActivemy CommandHandlerand中的事件MessageHandler。我认为channelRegistered也不行。

激活通道时有什么方法可以区分它们吗?或者我应该如何为我的场景做些什么?因为我想做一些事情channelActive,比如发送欢迎信息或将频道添加到群组。谢谢!

4

1 回答 1

0

如果不先读取一些数据,就无法检测协议......工作将如何?

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

于 2013-07-30T07:01:29.893 回答