1

所以,我有一个Message类,其中包含我要发送的所有信息。但是,它的内容可能会有很大差异。

通过 Netty 通道发送和接收(特别是解码/重组部分)此类对象的最简单方法是什么?(使用 Netty 3)

4

2 回答 2

2

ReplayingDecoder可能是您正在寻找的:

http://docs.jboss.org/netty/3.1/api/org/jboss/netty/handler/codec/replay/ReplayingDecoder.html

如果没有足够的数据而不是抛出错误,这将静默失败并重试decode(),直到所有数据都可用。

这是一个显示此操作的教程:

http://biasedbit.com/netty-tutorial-replaying-decoder/

于 2013-05-15T15:48:16.063 回答
2

我们使用 4 字节长度的前缀。我们在发送端使用OneToOneEncoder的子类,在接收端使用LengthFieldBasedFrameDecoder的子类。

写信息:

    private static final byte[] LENGTH_PLACEHOLDER = new byte[4];

    ChannelBufferOutputStream bout =
        new ChannelBufferOutputStream(dynamicBuffer(512, ctx.getChannel().getConfig().getBufferFactory()));
    bout.write(LENGTH_PLACEHOLDER);

    // write message contents here ...

    ChannelBuffer encoded = bout.buffer();
    encoded.setInt(0, encoded.writerIndex() - 4);
    return encoded;

LengthFieldBasedFrameDecoder 的构造函数参数:

private static final int MAX_OBJECT_SIZE = 1 << 21;

public MyDecoder() 
{
    super(MAX_OBJECT_SIZE, 0, 4, 0, 4);
}

阅读留言:

    ChannelBuffer frame = (ChannelBuffer) super.decode(ctx, channel, buffer);
    if (frame == null) {
        return null;
    }

    ChannelBufferInputStream data = new ChannelBufferInputStream(frame);

    // read message here ...
于 2013-05-15T15:52:58.660 回答