天道酬勤,学无止境

在 Netty 4.0 中创建一个 ByteBuf(Create a ByteBuf in Netty 4.0)

问题

两个简单的问题,我无法通过阅读文档来解决:

  1. 我有一个byte[]
    • 如何将其转换为ByteBuf
  2. 我有一个 NIO ByteBuffer
    • 如何将其转换为ByteBuf
回答1

文档对我来说似乎很清楚:

创建缓冲区

建议使用 Unpooled 中的辅助方法创建新缓冲区,而不是调用单个实现的构造函数。

然后在Unpooled ,您可以选择包装或复制。 例如:

  • Unpooled.copiedBuffer(ByteBuffer)
  • Unpooled.copiedBuffer(byte[])
  • Unpooled.wrappedBuffer(ByteBuffer)
  • Unpooled.wrappedBuffer(byte[])

根据您是否希望将返回的ByteBuf所做的更改传递到原始字节数组/缓冲区,选择合适的方法。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Create a ByteBuf in Netty 4.0
    Two simple questions, which I am not able to solve by reading the documentation: I have a byte[] How can i convert it to a ByteBuf? I have a NIO ByteBuffer How can i convert it to a ByteBuf?
  • Netty高并发网络应用框架-总结
    Netty高并发网络应用框架 如想了解更多更全面的Java必备内容可以阅读:所有JAVA必备知识点面试题文章目录: JAVA必备知识点面试题 来…直接进入主题: Netty网易云课堂在线学习资料:https://study.163.com/course/courseMain.htm?courseId=1209596850 文章目录 Netty高并发网络应用框架1、列举一下原生NIO还存的哪些问题?2、Netty的介绍,什么是Netty?3、目前存在的线程模型有哪些?4、Reactor 模型对传统阻塞IO服务模型做了那些改良?5、Reactor有哪三种典型的实现?6、什么是单Reactor单线程?7、什么是单Reactor多线程?8、什么是主从Reactor多线程?9、讲述一下什么是Netty模型?10、任务队列的使用场景有哪些?11、说一下什么是Netty异步模型的Futrue-Listener机制?12、说说Bootstrap和ServerBootstrap分别做什么用的?13、说说Netty中的Channel有哪些常用的类型?14、说说什么是ChannelHandler,及其重要子类和重要的基于事件监听的方法有哪些?15、说一下Netty中的ChannelPipeline是什么?16、说一下Netty中的ChannelHandlerContext是什么?17
  • Netty源码(一):Netty中的Buffer
     最近我学习了NIO相关的知识,然后发现了Netty这个基于NIO的网络应用框架,于是就研究起Netty框架源码,来好好体会一下网络框架的设计理念和思想.  这个系列的文章不仅会总结Netty各个模块的源码原理,也会写出一些自己对这些设计的理解和体会.  我基本按照并发编程网上这个系列文章的顺序来进行系列文章的顺序,不同的是我是基于Netty4.1的源码进行分析和讲解.  为了节约你的时间,本篇文章主要内容如下: - Netty的Buffer的内存模型,涉及读写指针 - Netty的Buffer框架 - Netty的Pool原理,轻量对象池Buffer Java NIO中的Buffer用于和NIO通道进行交互,数据可以从通道读入缓冲区,也可以从缓冲区写入到通道中.所以说,Buffer其实就是一块可以读写数据的内存,我们将其包装为一个Java对象来提供一系列读写操作.  Netty并没有直接使用Java NIO的Buffer实现,而是自己实现了一套Buffer框架来满足自己的业务或者性能需求.ByteBuf的基本原理读写指针的作用 不同于NIO Buffer的读写指针共用原理,ByteBuf拥有readerIndex,writerIndex两个指针.下面我们就来详细的讲解一下ByteBuf的内部原理. +-------------------+------------------+-
  • CompositeByteBuf 的 readableBytes 返回 0(CompositeByteBuf has readableBytes return 0)
    问题 以下代码有什么问题? 它总是为 readableBytes 打印 0,即使 CompositeByteBuf 中有明确的数据。 private void compositeTest() { ByteBuf buf1 = Unpooled.buffer(1024); buf1.writeBytes("hello".getBytes(StandardCharsets.UTF_8)); ByteBuf buf2 = Unpooled.buffer(1024); buf2.writeBytes("world".getBytes(StandardCharsets.UTF_8)); CompositeByteBuf composite = Unpooled.compositeBuffer(); composite.addComponent(buf1); composite.addComponent(buf2); System.out.println("Number of components " + composite.numComponents() + ", Composite readable bytes: " + composite.readableBytes()); } 最后一个打印语句打印: 组件数 2,复合可读字节数:0 我在 pom.xml 中使用它:
  • 泄漏:ByteBuf.release() 在被垃圾收集之前没有被调用。 Spring Reactor TcpServer(LEAK: ByteBuf.release() was not called in before it's garbage-collected. Spring Reactor TcpServer)
    问题 我使用 reactor-core [1.1.0.RELEASE] , reactor-net [1.1.0.RELEASE] 使用 netty-all [4.0.18.Final], reactor-spring-context [1.1.0.RELEASE] & Spring Reactor TcpServer [Spring 4.0.3.RELEASE]。 我在 netty 中创建了简单的 REST API 用于健康检查: /health 。 我遵循了 gs-reactor-thumbnailer 代码 请看代码如下: import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.FullHttpResponse; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty
  • netty源码解析(4.0)-20 ChannelHandler: 自己实现一个自定义协议的服务器和客户端
      本章不会直接分析Netty源码,而是通过使用Netty的能力实现一个自定义协议的服务器和客户端。通过这样的实践,可以更深刻地理解Netty的相关代码,同时可以了解,在设计实现自定义协议的过程中需要解决的一些关键问题。   本周章涉及到的代码可以从github上下载: https://github.com/brandonlyg/tinytransport.git。 设计协议   本章要设计的协议是基于TCP的应用层协议。在设计一个协议之前需要先回答以下几个问题: 使用场景是什么?这个协议有哪些功能?性能上有什么要求?对网络带宽有什么要求?安全上有哪些要求?     接下来依次回答这些问题:      使用场景   在可信任的内部网络中,不同进程之间高速交换消息。   功能 在客户端和服务器进行消息交换。发送消息然后异步接收响应。客户端和服务器之间可以保持长连接。传输大量的数据。   性能   数据包的提取性能接近内存copy。      扩展性   可以通过扩展header字段,进而扩展协议的功能。   带宽   尽量少的冗余数据,占用尽量小的带宽。      安全   由于是在可信任的内网中交互消息,没有特别端安全性要求。   这些问题的答案,就是整个协议的设计要求。下面就按照这些设计要求来设计一套完整的协议,具体类容包括以下两个部分: 数据包的格式
  • netty 的零拷贝机制
    什么是零拷贝 在操作系统层面上的零拷贝是指避免在用户态与内核态之间来回拷贝数据的技术。 Netty中的零拷贝与操作系统层面上的零拷贝不完全一样, Netty的零拷贝完全是在用户态(Java层面)的,更多是数据操作的优化。 传统网络网络io数据链路: 数据在read和write时,都会有一次用户态和内核态的切换以及buffer拷贝。 NIO的零拷贝: NIO的零拷贝与传统的文件IO操作最大的不同之处就在于它虽然也是要从磁盘读取数据,但是它并不需要将数据读取到OS内核缓冲区,而是直接将进程的用户私有地址空间中的一部分区域与文件对象建立起映射关系,这样直接从内存中读写文件,速度大幅度提升。 Netty的零拷贝主要体现在五个方面 Netty的接收和发送ByteBuffer使用直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。如果使用JVM的堆内存进行Socket读写,JVM会将堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中。相比于使用直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。Netty的文件传输调用FileRegion包装的transferTo方法,可以直接将文件缓冲区的数据发送到目标Channel,避免通过循环write方式导致的内存拷贝问题。Netty提供CompositeByteBuf类
  • netty高性能之道
    1.背景 1.1.惊人的性能数据 通过使用Netty (NI0框架)相比于传统基于Java序列化+BI0 (同步阻塞I0)的通信框架, 性能提升了8倍多。 事实上,我对这个数据并不感到惊讶,根据我多的NIO编程经验,通过选择合适的NI0框架, 精心的设计Reactor线程模型,达到上述性能指标是完全有可能的。 下面我们就一起来看下Netty是如何支持10WTPS的跨节点远程服务调用的,在正式开始讲 解之前,我们先简单介绍下Netty。 ###1.2. Netty基础入门 Netty是一个高性能、异步事件驱动的NI0框架,它提供了对TCP、UDP 和文件传输的支持, 作为一个异步NI0框架,Netty的所有I0 操作都是异步非阻塞的,通过Future-Li stener机制,用户可以方便的主动获取或者通过通知机制获得I0操作结果。 作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。 2. Netty高性能之道 2.1.RPC调用的性能模型分析 ####2.1.1.传统RPC调用性能差的三宗罪 网络传输方式问题:传统的RPC框架或者基于RMI等方式的远程服务(过程)调用采用了同 步阻塞I0,当客户端的并发压力或者网络时延增大之后,同步阻塞I0会由于频繁的wait
  • 雀食蟀!Java Netty实战入门
    一、Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。 Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Netty 都是异步的。 Netty 是最流行的 NIO 框架,它已经得到成百上千的商业、商用项目验证,许多框架和开源组件的底层 rpc 都是使用的 Netty,如 Dubbo、Elasticsearch 等等。下面是官网给出的一些 Netty 的特性: 设计方面 对各种传输协议提供统一的 API(使用阻塞和非阻塞套接字时候使用的是同一个 API,只是需要设置的参数不一样)。 基于一个灵活、可扩展的事件模型来实现关注点清晰分离。 高度可定制的线程模型——单线程、一个或多个线程池。 真正的无数据报套接字(UDP)的支持(since 3.1)。 易用性 完善的 Javadoc 文档和示例代码。 不需要额外的依赖,JDK 5 (Netty 3.x) 或者 JDK 6 (Netty 4.x) 已经足够。 性能 更好的吞吐量,更低的等待延迟。 更少的资源消耗。 最小化不必要的内存拷贝。 安全性 完整的
  • Netty使用教程(一)
    1.传输一个字符串 1. netty开发基本流程 基本流程 - 详细流程 标红的位置为客户端和服务端不同的地方 创建的工程名称,用驼峰命名法 内部jar包名称全部小写 创建类 - 创建类 2.分别实现客户端和服务器端 2.1 实现客户端 (1)增加Sharable注解,为了线程安全 客户端消息接收和异常处理 package com.xc.helloworld; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import java.nio.ByteBuffer; /** * @Author Michael * @Date 2008/08/11 20:42 * @Description; 通用handler,处理I/O时间 */ @ChannelHandler.Sharable// 为了线程安全 public class HandlerClientHello extends SimpleChannelInboundHandler<ByteBuf> { @Override protected
  • Netty在Android开发中的应用实战系列(一)——— 搭建服务端与客户端
    阅读本文建议从第一篇开始往后看 本系列文章 Netty在Android开发中的应用实战系列(一)——— 搭建服务端与客户端Netty在Android开发中的应用实战系列(二)——— Encoder | Decoder | Handler 的使用Netty在Android开发中的应用实战系列(三)——— 心跳处理 | 断线重连Netty在Android开发中的应用实战系列(四)——— 粘包 | 拆包 处理Netty在Android开发中的应用实战系列(五)——— 创建Web服务 | 作为HTTP服务器 一、简单的介绍一下Netty 官网地址:https://netty.io官网Jar包下载:https://netty.io/downloads.htmlJar包也可以去mvnrepository下载:https://mvnrepository.com/artifact/io.netty/netty-all直接上官网的介绍再好不过了 谷歌翻译过来就是 Netty是一个异步事件驱动的网络应用程序框架用于快速开发可维护的高性能协议服务器和客户端。Netty是一个NIO异步非阻塞应用程序框架,关于IO、NIO、AIO的理解大家可以找文章看看 二、创建Tcp服务端 引入netty-all-4.1.39.Final.jar 添加网络权限<uses-permission android:name=
  • 网络编程Netty入门:责任链模式介绍
    网络编程Netty入门:责任链模式介绍目录责任链模式责任链模式的简单实现Netty中的ChannelPipeline责任链服务端接收客户端连接pipeline初始化入站事件和出站事件Pipeline中的HandlerPipeline、channel、EventLoop的关系结束语责任链模式责任链模式为请求创建一个处理数据的链。客户端发起的请求和具体处理请求的过程进行了解耦,责任链上的处理者负责处理请求,客户端只需要把请求发送到责任链就行了,不需要去关心具体的处理逻辑和处理请求在责任链中是怎样传递的。想要深入的了解责任链模式,推荐看这篇文章:责任链模式的7种不同实现假设需要组装一台电脑,假设装CPU、插内存卡、装硬盘、机箱这个过程是按照这个顺序的,那么客户只需要发送一个请求说:我需要组装一台电脑,然后其他的就不需要管了,责任链内部怎么处理和怎么传递到下一个节点,不需要进行关心。责任链模式的简单实现责任链模式的实现,需要4个关键要素:1:处理器抽象类2:处理器抽象类的具体实现类3:保存和维护处理器信息的类4:处理器执行的类下面看一个简单的demo,基于责任链模式的思想:public class PipelineDemo { //初始化链的头部 public HandlerContext head = new HandlerContext(new AbstractHandler() {
  • netty填坑----论填坑,我是专业的
    1、为什么netty服务端启动后又无异常地自动退出?由于代码1处执行完后直接进入2、3,那么netty服务端就会关闭退出。解决一、直接在代码1后面处加上同步阻塞sync,那么只有服务端正常关闭channel时才会执行下面的语句解决二、把代码2和3移到operationComplete里面,那么也只有channel关闭时才会让netty的两个线程组关闭2、netty客户端连接池资源OOM生产环境用netty作为客户端,为了提高性能,客户端与服务端创建多条链路,同时客户端创建一个TCP连接池。结果业务高峰期OOM从异常日志和线程资源占用来看,导致内存泄漏的原因是应用创建了大量的EventLoopGroup线程池。这就是一个TCP连接对应一个NIO线程的模式。错误之在就是采用BIO模式来调用NIO通信框架,不仅没优化效果,还发生了OOM。正确操作是注意:Bootstrap自身不是线程安全的,但执行Bootstrap的连接操作是串行执行的。connect方法它会创建一个新的NioSocketChannel,并从初始构造的EventLoopGroup中选择一个NioEventLoop线程执行真正的Channel连接操作,与执行Boostrap的线程无关。在同一个Boostrap创建多个客户端连接,EventLoopGroup是共享的,这些连接共用同一个NIO线程组EventLoopGroup
  • Netty ByteBuf 在解码时没有得到大输入的完整信息(Netty ByteBuf dont get the full message of a large input when decoding)
    问题 有一个遗留应用程序通过 TCP 执行 json。 我使用的是 netty 服务器,我想通过 Gson 将 json 转换为 Pojo。 为了做到这一点,我转换创建了一个解码器,它将 ByteBuf 作为输入并创建我的对象。 问题是 Bytebuf 的大小为 1024,而 json 比这大得多(> 20mo) @Sharable public class RequestDecoder extends MessageToMessageDecoder<ByteBuf> { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception { InputStream json = new ByteBufInputStream(msg); InputStreamReader inputStreamReader = new InputStreamReader(json, Charsets.UTF_8); JsonReader reader; reader = new JsonReader(inputStreamReader); reader.setLenient(true); Request object = new Gson()
  • netty性能调优
    转载自STEPHEN的博客 调优思路 关于netty的学习和介绍,可以去github看官方文档,这里良心推荐《netty实战》和《netty权威指南》两本书,前者对于新手更友好,原理和应用都有讲到,多读读会发现很多高性能的优化点。 netty高性能优化点 最近参加了阿里中间价性能比赛,为了提升netty写的servive mesh的网络通信的性能,最近几天查了书、博客(这里强力推荐netty作者的博客,干货真的很多),自己总结了如下一下优化点。如果有错误希望能指正。 注:这里所讨论的对应的netty版本为netty4 首先要明确要netty优化的几个主要的关注点。 减少线程切换的开销。复用channel,可以选择可共享的channel(@sharable,减少堆内存开销)zero copy的应用减少并发下的竞态情况 1 尽可能的复用EventLoopGroup。 这里就要涉及netty的线程模型了。netty实战的第七章里有很细致的阐释。简单说EventLoopGroup包含了指定数量(如果没有指定,默认是cpu核数的两倍,可以从源码中看到)的EvenetLoop,Eve netLoop和channel的关系是一对多,一个channel被分配给一个EventLoop,它生命周期中都会使用这个EventLoop,而EventLoop背后就是线程。见下图。
  • 如果JVM GC仍然存在,为什么我们需要手动处理Netty ByteBuf的引用计数?(Why do we need to manually handle reference counting for Netty ByteBuf if JVM GC is still in place?)
    问题 根据《 Netty in Action v10 》一书, reference counting用于处理ByteBuf的池化。 但是JVM并不了解净引用计数,因此JVM仍可以GC ByteBuf 。 如果是这样,为什么我们仍然需要关心引用计数并手动调用release()方法? 我引用了《 Netty in Action v10》一书中的一些内容,以添加一些上下文。 引用计数的折衷之一是,用户在消费消息时必须小心。 尽管JVM仍然能够GC这样的消息(因为它不知道引用计数),但是该消息不会放回到以前可能从中获得它的池中。 因此,如果不小心释放这些消息,很有可能一次耗尽资源。 以及一些相关线程:Netty 4中的缓冲区所有权:如何管理缓冲区生命周期? https://blog.twitter.com/2013/netty-4-at-twitter-reduced-gc-overhead 加1 (下面是我的一些理解。) ByteBuf可以从两个角度进行分类: 1. Pooled or Unpooled 2. Heap-based or Direct 因此,可以有4种组合: (a) Pooled Heap-based (b) Pooled Direct (c) Unpooled Heap-based (d) Unpooled Direct JVM GC机制仅影响(a)和(c)
  • 当我必须在 Netty4 编码器中调用 ByteBuf.retain() 时?(When I have to call ByteBuf.retain() in a Netty4 Encoder?)
    问题 我正在编写一个 NUL 终止 JSON 消息的编码器,以便在消息碎片化的情况下可以对其进行解码。 我找到了这个示例->单击最终调用ByteBuf.retain()的位置,将现有的 ByteBuf 写入输出。 他们为什么这样做,为什么需要这样做? 这是我的编码器: public class FrameEncoder extends MessageToMessageEncoder<ByteBuf> { @Override protected void encode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception { out.add(msg.retain()); out.add(ctx.alloc().buffer(1).writeByte(NUL)); } } 回答1 默认情况下MessageToMessageEncoder在编码后release原始消息。 这与MessageToMessageEncoder的典型用例一致,当您的编码器作为编码结果返回新消息时,可以在编码后安全地丢弃原始消息。 但是,在将原始消息用作结果的一部分时,不应将其丢弃,就像您的情况一样。 在这种情况下,您需要显式调用retain() 。 来自 MessageToMessageEncoder 的
  • netty零拷贝之CompositeByteBuf
    目录 一、 背景简介 二、 netty零拷贝 一、背景简介 在TCP网络数据传输过程中,数据包有可能被分割为独立的几个数据包进行发送,对于服务器接收端来说,单个的数据包是没有任何意义的,只有将这些数据包组合到一起,才能接收后解码然后提供给我们的业务层进行处理,而在数据报价进行整合的过程中,零拷贝做的工作就是避免或者减少内存区域中数据的复制次数,进而提高程序的响应性能。 二、 netty零拷贝 netty对于零拷贝有几种不同的形式,其本质上都是讲两个或者多个ByteBuf逻辑上组合到一起,物理上不一定是连续的,在操作数据时候, 不必再将一个ByteBuf拷贝到另一个ByteBuf中去. 因此少了内存的拷贝。而且netty的ByteBuf 支持 slice 操作, 可以将 ByteBuf 分解为多个 ByteBuf, 这些ByteBuf共享同一个内存区域,这样也就避免了内存的拷贝。 CompositeByteBuf 零拷贝: CompositeByteBuf字面意思就是组合ByteBuf,他会把多个ByteBuf组合到一起,这些ByteBuf在逻辑上连续,实际物理地址不一定连续。 CompositeByteBuf中主要通过addComponent方法进行ByteBuf的合并。 进入到addComponent方法 public CompositeByteBuf addComponents
  • Netty实战入门
    目录 一、Netty 简介 二、一个简单 Http 服务器 三、编写 Netty 客户端 四、Channel、ChannelPipeline、ChannelHandler、ChannelHandlerContext 之间的关系 五、Netty 线程模型 Reactor 单线程模型 Reactor 多线程模型 主从 Reactor 多线程模型 一、Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。 Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Netty 都是异步的。 Netty 是最流行的 NIO 框架,它已经得到成百上千的商业、商用项目验证,许多框架和开源组件的底层 rpc 都是使用的 Netty,如 Dubbo、Elasticsearch 等等。下面是官网给出的一些 Netty 的特性: 设计方面 对各种传输协议提供统一的 API(使用阻塞和非阻塞套接字时候使用的是同一个 API,只是需要设置的参数不一样)。基于一个灵活、可扩展的事件模型来实现关注点清晰分离。高度可定制的线程模型——单线程
  • 网络编程Netty入门:Netty的启动过程分析
    网络编程Netty入门:Netty的启动过程分析目录Netty的启动过程Bootstrap服务端的启动客户端的启动TCP粘包、拆包图示简单的例子Netty编解码框架MessageToMessageEncoder实现类ByteToMessageDecoder实现类MessageToMessageDecoder实现类Netty解码器Netty编码器Netty编码解码器Netty的启动过程BootstrapBootstrap是Netty中负责引导服务端和客户端启动的,它将ChannelPipeline、ChannelHandler和EventLoop组织起来,让它成为一个可以实际运行的程序,引导一个应用程序,简单来说,是先对它进行配置,然后让它运行起来的过程Netty有两个引导启动的类:1:Bootstrap引导客户端运行2:ServerBootstrap引导服务端运行下面根据源码看下启动过程是怎样的:服务端的启动首先看下服务端的代码示例:static final int PORT = Integer.parseInt(System.getProperty("port", "8099")); public static void main(String[] args) { //1:创建EventLoopGroup EventLoopGroup bossGroup = new