【问题标题】:(Java/netty) What's the easiest way to send and receive variable-size objects with Netty?(Java/netty) 使用 Netty 发送和接收可变大小对象的最简单方法是什么?
【发布时间】:2013-05-15 15:42:44
【问题描述】:

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

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

【问题讨论】:

    标签: java object networking netty


    【解决方案1】:

    我们使用 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 ...
    

    【讨论】:

    • 那么,当我发送一个对象时,Netty 库没有办法在这个长度值前面加上这个值吗? (并且,在接收时,检查它?)
    • 这个解决方案似乎非常接近我想要的......你能提供一些代码 sn-ps 显示如何编写它吗?
    • @EduardoBezerra - 在编码器中写入时添加它,基于帧的解码器将自动读取它并确保在尝试解码之前它拥有所有数据。
    【解决方案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/

    【讨论】:

    • 我看过这个教程,但它似乎有点复杂,代码太多......我想知道是否没有更短,更优雅的方式来做同样的事情......对于一件事,我相信长度属性就足够了(其他的可能在消息对象中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    相关资源
    最近更新 更多