Я хочу использовать один экземпляр netty для обслуживания как веб-сокетов (socketio), так и необработанных TCP-соединений. Сейчас я хочу иметь ТОЛЬКО RoutingHandler в начале, который проверяет первый байт, если он равен '[', затем удаляю RoutingHandler и добавляю обработчики tcp в конвейер канала, в противном случае добавляю обработчики веб-сокетов. Код выглядит так:
public class RoutingHandler extends SimpleChannelInboundHandler<ByteBuf> {
private final ServerContext context;
public RoutingHandler(final ServerContext context) {
this.context = context;
}
@Override
protected void channelRead0(final ChannelHandlerContext ctx, final ByteBuf in) throws Exception {
if (in.isReadable()) {
ctx.pipeline().remove(this);
final byte firstByte = in.readByte();
in.readerIndex(0);
if (firstByte == 0x5B) {
this.context.routeChannelToTcp(ctx.channel());
} else {
// websocket
this.context.routeChannelToSocketIO(ctx.channel());
}
ctx.pipeline().fireChannelActive();
final byte[] copy = new byte[in.readableBytes()];
in.readBytes(copy);
ctx.pipeline().fireChannelRead(Unpooled.wrappedBuffer(copy));
}
}
}
Код, кажется, работает, но это не лучший способ сделать это, особенно я как бы взламываю жизненный цикл канала, вручную вызывая fireChannelActive (), потому что добавление дополнительных обработчиков не запускает активное событие снова, поэтому некоторый код инициализации не бег.
Что-то не так с моим решением? Как лучше это сделать? Спасибо