Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Java/netty)什么';使用Netty发送和接收可变大小对象的最简单方法是什么?_Java_Object_Networking_Netty - Fatal编程技术网

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

(Java/netty)什么';使用Netty发送和接收可变大小对象的最简单方法是什么?,java,object,networking,netty,Java,Object,Networking,Netty,因此,我有一个Message类,它包含我想要发送的所有信息。然而,它的内容可以有很大的不同 通过网络通道发送和接收此类对象(特别是解码/重组部分)最简单的方法是什么?(使用Netty 3)您可能正在寻找的是ReplayingDecoder: 如果没有足够的数据,则不会抛出错误,而是会自动失败并重试decode(),直到所有数据都可用 以下是一个教程,展示了这一点: 您可能正在寻找的是回放解码器: 如果没有足够的数据,则不会抛出错误,而是会自动失败并重试decode(),直到所有数据都可用 以

因此,我有一个
Message
类,它包含我想要发送的所有信息。然而,它的内容可以有很大的不同


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

您可能正在寻找的是
ReplayingDecoder

如果没有足够的数据,则不会抛出错误,而是会自动失败并重试
decode()
,直到所有数据都可用

以下是一个教程,展示了这一点:


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

如果没有足够的数据,则不会抛出错误,而是会自动失败并重试
decode()
,直到所有数据都可用

以下是一个教程,展示了这一点:


我们使用4字节长度的前缀。我们在发送端使用的是的子类,在接收端使用的是的子类

写消息:

    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);
}

我们使用4字节长度的前缀。我们在发送端使用的是的子类,在接收端使用的是的子类

写消息:

    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);
}

所以,当我发送一个对象时,Netty库不可能预先设置这个长度值?(并且,当收到时,检查它?)这个解决方案似乎非常接近我想要的。。。你能提供一些代码片段来说明如何准确地编写它吗?@Eduardobezera-当你在编码器中写入时,你会预先编写它,基于帧的解码器会自动神奇地读取它,并确保它在尝试解码之前拥有所有数据。因此,当我发送对象时,Netty库不可能预先编写这个长度值?(并且,当收到时,检查它?)这个解决方案似乎非常接近我想要的。。。你能提供一些代码片段来说明如何准确地编写它吗?@Eduardobezera-当你在编码器中编写代码时,你会预先编写它,基于帧的解码器会自动神奇地读取它,并确保它在尝试解码之前拥有所有的数据。我看过这个教程,但它似乎有点复杂,代码太多了。。。我想知道是否有一种更短、更优雅的方式来做同样的事情。。。首先,我相信length属性就足够了(其他属性可能在message对象中)。我看过本教程,但它似乎有点复杂,代码太多了。。。我想知道是否有一种更短、更优雅的方式来做同样的事情。。。首先,我相信length属性就足够了(其他属性可能在message对象内部)。