Netty 'handshake' 解码器,告诉客户端发送数据的更好方式

Netty 'handshake' decoder, better way to tell the client to send data

在我的客户端->服务器应用程序中,客户端将发送一个操作码,告诉服务器要启动哪个服务,但是当涉及到更新请求时,设计有点奇怪,当我收到操作码时,客户端期望 8 个(虚拟)字节告诉它开始发送更新数据。

这是我的握手解码器:

@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) {
    if (!buffer.isReadable()) {
        return;
    }

    int id = buffer.readUnsignedByte();

    switch (id) {
    case HandshakeConstants.SERVICE_GAME:
        ctx.pipeline().addFirst("loginEncoder", new LoginEncoder());
        ctx.pipeline().addAfter("handshakeDecoder", "loginDecoder", new LoginDecoder());
        break;
    case HandshakeConstants.SERVICE_UPDATE:
        ctx.pipeline().addFirst("updateEncoder", new UpdateEncoder());
        ctx.pipeline().addBefore("handler", "updateDecoder", new UpdateDecoder());

        // XXX: Better way?
        ByteBuf buf = ctx.alloc().buffer(8).writeLong(0);
        ctx.channel().writeAndFlush(buf);
        break;
    default:
        throw new IllegalStateException("Invalid service id");
    }

    ctx.pipeline().remove(this);
    out.add(new HandshakeMessage(id));
}

正如您在代码中看到的那样,在我将服务的适当编码器和通道处理程序添加到管道后,我必须写入 8 个字节来告诉客户端开始发送更新数据;有什么(干净的)方法可以解决这个问题吗?

我认为您的解决方案很有意义,我认为它没有任何问题。