Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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 4.0 ByteBuf retain()使用_Java_Sockets_Netty - Fatal编程技术网

Java Netty 4.0 ByteBuf retain()使用

Java Netty 4.0 ByteBuf retain()使用,java,sockets,netty,Java,Sockets,Netty,我试图理解基于实现的解码aTrack协议,他们使用Netty实现他们的平台,但我不知道这是使用ByteBuf对象的保留方法。他们用这种方法: protected Object decode( Channel channel, SocketAddress remoteAddress, Object msg) throws Exception { ByteBuf buf = (ByteBuf) msg; if (buf.getUnsignedShort(buf.r

我试图理解基于实现的解码aTrack协议,他们使用Netty实现他们的平台,但我不知道这是使用ByteBuf对象的保留方法。他们用这种方法:

protected Object decode(
        Channel channel, SocketAddress remoteAddress, Object msg) throws Exception {

    ByteBuf buf = (ByteBuf) msg;

    if (buf.getUnsignedShort(buf.readerIndex()) == 0xfe02) {
        if (channel != null) {
            channel.writeAndFlush(new NetworkMessage(buf.retain(), remoteAddress)); // keep-alive message
        }
        return null;
    } else if (buf.getByte(buf.readerIndex()) == '$') {
        return decodeInfo(channel, remoteAddress, buf.toString(StandardCharsets.US_ASCII).trim());
    } else if (buf.getByte(buf.readerIndex() + 2) == ',') {
        return decodeText(channel, remoteAddress, buf.toString(StandardCharsets.US_ASCII).trim());
    } else {
        return decodeBinary(channel, remoteAddress, buf);
    }
}
有人能给我解释一下ByteBuf retain()方法是如何工作的吗? 谢谢。

书中:

对于编码器和解码器,一旦消息被编码或解码,它将通过调用
ReferenceCountUtil.release(message)
自动释放。如果需要保留引用以供以后使用,可以调用
ReferenceCountUtil.retain(message)
。这会增加引用计数,从而防止消息被释放

关于什么是参考计数的进一步说明,这将有助于:

引用计数是一种优化内存使用和性能的技术 当一个对象不再被其他对象引用时,释放该对象所持有的资源。
ReferenceCounted
实现实例通常以活动引用计数1开始。只要引用计数大于0,就保证不会释放对象。当活动引用的数量减少到0时,实例将被释放。请注意,已释放的对象应不再可供使用

书中:

对于编码器和解码器,一旦消息被编码或解码,它将通过调用
ReferenceCountUtil.release(message)
自动释放。如果需要保留引用以供以后使用,可以调用
ReferenceCountUtil.retain(message)
。这会增加引用计数,从而防止消息被释放

关于什么是参考计数的进一步说明,这将有助于:

引用计数是一种优化内存使用和性能的技术 当一个对象不再被其他对象引用时,释放该对象所持有的资源。
ReferenceCounted
实现实例通常以活动引用计数1开始。只要引用计数大于0,就保证不会释放对象。当活动引用的数量减少到0时,实例将被释放。请注意,已释放的对象应不再可供使用


好的,很好,如果我理解的很好,那么它发送的信息与收到的信息相同?是的,并确保
buf
可以在以后无问题地重复使用。很好!!非常感谢@Riyafa,我会尝试在netty framework中实现我的问题,我读了你推荐给我的书中的一些内容,这听起来是解决网络性能问题的一个非常好的方法。好的,太好了,如果我理解得很好,它正在发送与接收到的消息相同的消息作为应答?是,并确保
buf
可以在以后无问题地重复使用。太好了!!非常感谢@Riyafa,我会尝试在netty框架中实现我的问题,我读了你推荐给我的书中的一些内容,这听起来是解决网络性能问题的一个非常好的方法。