現在、2 つのエンコーダー、1 つのデコーダー、およびChannelInboundMessageHandlerAdapter<ByteBuf>
. エンコーダは aMessageToByteEncoder<Packet>
および aByteToByteEncoder
です。ChannelOutboundMessageHandlerAdapter
aと aを使用してみましたChannelOutboundByteHandlerAdapter
が、どちらも問題を解決しませんでした。最初のエンコーダー (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);
}
}
パイプラインでの順序を変更しようとしましたが、役に立ちませんでした。どこかで無意味な何かを見逃しているだけだと思いますが、どこで何をしているのかわかりません。どんな助けでも大歓迎です。
前もって感謝します!