如何以小端为前缀

时间:2013-09-17 11:19:10

标签: java netty

我有一个基于 netty 4.0 的应用程序,我需要在 LITTLE_ENDIAN 中接收/发送前缀为2字节邮件大小的邮件。

我想出了接收部分,我正在成功接收消息。

但我无法弄清楚如何为 Prepender 做同样的事情, Prepender 目前在默认情况下增加了 BIG_ENDIAN 的长度。请告知我如何更改此内容。

@Override
public void initChannel(SocketChannel ch) throws Exception {
    ch.pipeline()
    // Decoder - This part works as expected
    .addLast("frameDecoder", new LengthFieldBasedFrameDecoder(ByteOrder.LITTLE_ENDIAN, 4096 /*maximum length*/, 0 /* size field offset */, 2 /* size field length */, 0, 2, false))
    .addLast("protobufDecoder", new ProtobufDecoder(MoopRrAdmin.AdminResponse.getDefaultInstance(), extensionRegistry))

    // Encoder the Prepender adds length in BIG ENDIAN which is wrong
    .addLast("frameEncoder", new LengthFieldPrepender(2 /* size filed length */, 0 /* length adjustment */, true /* size includes size field */))
    .addLast("protobufEncoder", new ProtobufEncoder())

    // Handler
    .addLast(new MoopConnectionHandler(requester, instanceConnectionManager));
}

修改

只是为了分享实际工作的临时解决方案。问题仍然存在,因为我不相信这是预期的方式......

...
// Encoder
.addLast("frameEncoder", new LengthFieldPrepender(2 /* size filed length */, 0 /* length adjustment */, false /* size includes size field */) {
    @Override
    protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception {
        ByteBuf outWithLittleEndian = out.order(ByteOrder.LITTLE_ENDIAN);
        super.encode(ctx, msg, outWithLittleEndian);
    }
})
...

0 个答案:

没有答案