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 个字节来告诉客户端开始发送更新数据;有什么(干净的)方法可以解决这个问题吗?
我认为您的解决方案很有意义,我认为它没有任何问题。
在我的客户端->服务器应用程序中,客户端将发送一个操作码,告诉服务器要启动哪个服务,但是当涉及到更新请求时,设计有点奇怪,当我收到操作码时,客户端期望 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 个字节来告诉客户端开始发送更新数据;有什么(干净的)方法可以解决这个问题吗?
我认为您的解决方案很有意义,我认为它没有任何问题。