java - (Java/netty) 使用 Netty 发送和接收可变大小对象的最简单方法是什么?

标签 java object networking netty

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

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

最佳答案

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

关于java - (Java/netty) 使用 Netty 发送和接收可变大小对象的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16569471/

相关文章:

c++ - C++代码说明

java - 如何在 java 中打印/记录字符串数组?

Android 网络位置提供商问题

java - 关于 Java HashMap : when key is a Set<Integer>

java - 在 Lotusscript 中,如何通过按钮通过电子邮件发送表单并包含所有表单数据?

java - 处理程序更新 fragment 中的 UI 时出现延迟?

ssl - 在 Jetty 环境中操纵 TLS1.2 通信的可能性

java - libGDX X 和 Y 鼠标输入

javascript - 如何获取所有 LI UL 元素 ID 值并将它们放入 JavaScript 数组中?

c++ - qt 窗口共享