1

だから、私はMessage送信したいすべての情報を含むクラスを持っています。ただし、その内容は大きく異なる場合があります。

Netty チャネルを介してそのような種類のオブジェクトを送受信する (特にデコード/再アセンブリ部分) 最も簡単な方法は何ですか? (Netty 3 を使用)

4

2 に答える 2

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 に答える