当前位置: 首页 > 知识库问答 >
问题:

(爪哇/网络)使用Netty发送和接收可变大小的对象的最简单方法是什么?

淳于枫
2023-03-14

因此,我有一个< code>Message类,它包含了我想要发送的所有信息。然而,它的内容可以变化很大。

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

共有2个答案

林鸿飞
2023-03-14

重放解码器可能是您正在寻找的:

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

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

下面是一个教程,演示了此操作的实际效果:

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

鲁涵映
2023-03-14

我们使用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 ...
 类似资料:
  • 问题内容: 我在生产中有20GB +的rdb转储。我怀疑有一组特定的按键使它blo肿。我希望有一种方法可以始终从静态转储分析中发现前100个最大对象,或者将其询问给服务器本身,而服务器本身有7M个对象。 像rdbtools这样的转储分析工具在这个(我认为)非常常见的用例中无济于事! 我当时想编写一个脚本,并使用“ redis-cli调试对象”对整个键集进行迭代,但是我感觉必须缺少某些工具。 问题答

  • 问题内容: 现在,我有一个Java程序,其类当前为POJO,并存储在易失性内存中。这些必须坚持下去。据我了解,两个流行的选择是JDO和Java Persistence API。对于对SQL,Torque等了解甚少的人,这是向程序数据添加持久性的最简单方法? 问题答案: 序列化到文件系统的传统方法是使用Java序列化。但是,您需要在各处实现Serializable。 一个更简单的解决方案是使用XSt

  • 目前,我正在尝试保存一个ImageView对象,如下所示 如何进行此转换,或者是否有更好的方法来保存ImageView对象?

  • 问题内容: 我有一个应用程序,它读取带有大量数据行的CSV文件。我根据数据类型为用户提供了行数的摘要,但我想确保不会读取太多的数据行并导致OutOfMemoryErrors。每行转换为一个对象。有没有一种简便的方法以编程方式找出该对象的大小?是否有一个引用定义了一个原始类型和对象引用有多大VM? 现在,我的代码可以读取多达32,000行,但我还想让代码显示尽可能多地读取行,直到使用32 MB内存为

  • 我有一个可编码的类: 当我尝试实例化它时: 这给了我一个错误: 调用中缺少参数“from”的参数 我只想在数组中插入一个新对象(newTask)。最简单的方法是什么?

  • 问题内容: 我正在尝试使用JSON(使用simplejson)序列化python对象列表,并收到以下错误:对象“不可JSON序列化”。 该类是一个简单的类,其字段只有整数,字符串和浮点数,并且从一个父超类继承相似的字段,例如: foo,bar是我上面提到的简单类型。唯一棘手的事情是,ChildClass有时具有一个字段,该字段引用另一个对象(类型不是ParentClass或ChildClass)。