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

Netty java从ByteBuf获取数据

严成礼
2023-03-14

在下面的代码中,如何有效地从ByteBuf获取字节数组?我需要获取数组,然后序列化它。

package testingNetty;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

public class ServerHandler extends  ChannelInboundHandlerAdapter {
     @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
         System.out.println("Message receive");
         ByteBuf buff = (ByteBuf) msg;
             // There is I need get bytes from buff and make serialization
         byte[] bytes = BuffConvertor.GetBytes(buff);
        }

        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { 
            // Close the connection when an exception is raised.
            cause.printStackTrace();
            ctx.close();
        }

}

共有1个答案

蒯胜泫
2023-03-14
ByteBuf buf = ...
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);

如果不想更改readerIndex,请执行以下操作:

ByteBuf buf = ...
byte[] bytes = new byte[buf.readableBytes()];
int readerIndex = buf.readerIndex();
buf.getBytes(readerIndex, bytes);

如果要最小化内存拷贝,可以使用ByteBuf的备份数组(如果可用):

ByteBuf buf = ...
byte[] bytes;
int offset;
int length = buf.readableBytes();

if (buf.hasArray()) {
    bytes = buf.array();
    offset = buf.arrayOffset();
} else {
    bytes = new byte[length];
    buf.getBytes(buf.readerIndex(), bytes);
    offset = 0;
}

请注意,您不能简单地使用buf.array(),因为:

  • 不是所有的ByteBuf都有后备数组。有些是堆外缓冲区(即直接内存)
  • 即使一个ByteBuf有一个后备数组(即buf.hasArray()返回true),以下情况也不一定是真的,因为缓冲区可能是其他缓冲区的一个片段池缓冲:
    • buf.array()[0]==buf.get字节(0)
    • buf.array==buf.capacity

 类似资料:
  • 问题内容: 如何在下面的代码中有效地获取字节数组?我需要获取数组,然后对其进行序列化。 问题答案: 如果您不想更改readerIndex: 如果要最小化内存副本,可以使用的支持数组(如果有): 请注意,您不能简单地使用,因为: 并非所有人都有支持数组。一些是堆外缓冲区(即直接内存) 即使a 具有支持数组(即return ),也不一定要满足以下条件,因为该缓冲区可能是其他缓冲区或池化缓冲区的一部分:

  • 问题内容: 日志,为什么? 问题答案: 为了详细说明@Raynos所说的内容,您定义的函数是一个异步回调。它不会立即执行,而是在文件加载完成后执行。当您调用readFile时,将立即返回控件并执行下一行代码。因此,当您调用console.log时,尚未调用您的回调,并且尚未设置此内容。欢迎使用异步编程。 示例方法 或者更好的是,如Raynos的示例所示,将您的调用包装在一个函数中并传递您自己的回调

  • 我一直在尝试使用nativescript创建一个android应用程序。我正在使用fetch模块从服务器获取响应。当我试图从httpbin获得响应时。org/get,没关系。但当我试图从本地服务器获取响应时,网络请求失败。错误 发送到httpbin。组织/获取- 发送到本地主机:8000/api- 当我尝试从纯节点中的localhost:8000/api获取响应时。js通过请求模块。它工作得很好。

  • 我需要从firestore中的以下数据结构中获取formName和id的数据。在这种情况下,如何获取数据,比如创建嵌套对象?

  • 问题内容: 这是我从foursquare获得的JSON的一部分。 JSON格式 我需要获取最后的提示 文本 ,编写它的 用户 以及他编写/发布它的 日期 。 用户 :达米尔·P。 日期 :1314115358 文字 :健身中心 我尝试使用 JQuery ,这可以获取非数组值: 但这不适用于数组。 结果 :未捕获的TypeError:无法读取未定义的属性“文本”。 我也尝试了 $ .each ,但没