我目前已经建立了一个网络客户端,它使用两个编码器、一个解码器和一个ChannelInboundMessageHandlerAdapter<ByteBuf>
. 编码器是 aMessageToByteEncoder<Packet>
和 a ByteToByteEncoder
。我试过使用 aChannelOutboundMessageHandlerAdapter
和 aChannelOutboundByteHandlerAdapter
但他们都没有解决这个问题。它进入第一个编码器(PacketEncoder
或MessageToByteEncoder<Packet>
)就好了,但无法输入ByteToByteEncoder
后缀并且没有数据发送到服务器。
我的管道设置如下:
ChannelPipeline pipeline = ch.pipeline();
// Decoders
pipeline.addLast("buffer_length_decoder", new BufferLengthDecoder());
pipeline.addLast("packet_decoder", new PacketDecoder());
// Encoder
pipeline.addLast("buffer_length_encoder", new BufferLengthEncoder());
pipeline.addLast("packet_encoder", new PacketEncoder());
PacketEncoder 看起来像这样:
public class PacketEncoder extends MessageToByteEncoder<Packet> {
private static final Logger logger = LoggerFactory.getLogger(PacketEncoder.class);
@Override
protected void encode(ChannelHandlerContext ctx, Packet msg, ByteBuf out) throws Exception {
ByteBuf buf = msg.buf();
buf = buf.capacity(buf.readableBytes());
logger.info(Utils.toHexString(buf.array()));
out.writeBytes(buf);
}
}
BufferLengthEncoder 看起来像这样:
public class BufferLengthEncoder extends ByteToByteEncoder {
private static final Logger logger = LoggerFactory.getLogger(BufferLengthEncoder.class);
@Override
protected void encode(ChannelHandlerContext ctx, ByteBuf in, ByteBuf out) throws Exception {
logger.info(Utils.toHexString(in.array()));
out = out.writeInt(in.readableBytes()).writeBytes(in);
}
}
我曾尝试更改他们在管道中的顺序但无济于事。我假设我只是在某处遗漏了一些荒谬的东西,但我不确定在哪里或什么。非常感谢任何和所有帮助。
提前致谢!