当前位置: 首页 > 面试题库 >

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

}

问题答案:
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都有支持数组。一些是堆外缓冲区(即直接内存)
  • 即使a ByteBuf具有支持数组(即buf.hasArray()return true),也不一定要满足以下条件,因为该缓冲区可能是其他缓冲区或池化缓冲区的一部分:
    • buf.array()[0] == buf.getByte(0)
    • buf.array().length == buf.capacity()


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

  • 问题内容: 日志,为什么? 问题答案: 为了详细说明@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 ,但没