【发布时间】:2013-05-15 15:42:44
【问题描述】:
所以,我有一个Message 类,其中包含我要发送的所有信息。但是,它的内容可能千差万别。
通过 Netty 通道发送和接收(特别是解码/重组部分)此类对象的最简单方法是什么? (使用 Netty 3)
【问题讨论】:
标签: java object networking netty
所以,我有一个Message 类,其中包含我要发送的所有信息。但是,它的内容可能千差万别。
通过 Netty 通道发送和接收(特别是解码/重组部分)此类对象的最简单方法是什么? (使用 Netty 3)
【问题讨论】:
标签: java object networking netty
我们使用 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 ...
【讨论】:
ReplayingDecoder 可能就是您要找的:
http://docs.jboss.org/netty/3.1/api/org/jboss/netty/handler/codec/replay/ReplayingDecoder.html
如果没有足够的数据而不是抛出错误,这将静默失败并重试decode(),直到所有数据都可用。
这里有一个实际演示的教程:
【讨论】: