首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Netty in action—Netty中的ByteBuf

Netty提供了一个更好的实现:ByteBuf。 ByteBuf的API Netty为数据处理提供的API通过抽象类ByteBuf和接口ByteBufHolder暴露出来。...当你从ByteBuf中读,它的readerIndex增加了读取的字节数;同理,当你向ByteBuf中写,writerIndex增加。...Netty通过ByteBuf的子类-CompositeByteBuf来实现这种模式,提供了将多个buffer虚拟成一个合并的Buffer的技术。...handleArray(array, 0, array.length); Netty通过CompositeByteBuf来优化socket的IO操作,尽可能的消除JDK buffer实现中的性能和内存使用中的不足...尽管这些优化被封装到Netty的核心代码中,但你应该意识到这些优化的影响。 字节级别的操作 除了基本的读写操作,ByteBuf提供了大量的修改它数据的方法。下面我们会讨论最重要的一些。

65820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    netty系列之:netty中的Channel详解

    简介 Channel是连接ByteBuf和Event的桥梁,netty中的Channel提供了统一的API,通过这种统一的API,netty可以轻松的对接多种传输类型,如OIO,NIO等。...再看下channel中定义的方法: 可以看出channel中定义的方法是多种多样的,这些方法都有些什么特点呢?接下来一一为您讲解。...中的Channel是有层级结构的,通过parent属性可获取这种层级结构。...总结 Channel在netty中是做为一个关键的通道而存在的,后面的Event和Handler是以channel为基础运行的,所以说Channel就是netty的基础,好了,今天的介绍到这里就结束了,...本文已收录于 http://www.flydean.com/04-netty-channel/ 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

    40250

    netty系列之:netty中的ByteBuf详解

    ByteBuf详解 netty提供了一个io.netty.buffer的包,该包里面定义了各种类型的ByteBuf和其衍生的类型。...netty Buffer的基础是ByteBuf类,这是一个抽象类,其他的Buffer类基本上都是由该类衍生而得的,这个类也定义了netty整体Buffer的基调。...注意的是,虽然JDK中有自带的ByteBuffer类,但是netty中的 ByteBuf 算是对Byte Buffer的重新实现。他们没有关联关系。...wrappedBuffer是对现有的byte arrays或者byte buffers的封装,可以看做是一个视图,当底层的数据发生变化的时候,Wrapped buffer中的数据也会发生变化。...总结 ByteBuf是netty的底层基础,是传输数据的承载对象,深入理解ByteBuf就可以搞懂netty的设计思想,非常不错。

    1K20

    netty系列之:netty中的Channel详解

    简介 Channel是连接ByteBuf和Event的桥梁,netty中的Channel提供了统一的API,通过这种统一的API,netty可以轻松的对接多种传输类型,如OIO,NIO等。...你可以通过Channel来判断当前的状态,是open还是connected,还可以判断当前Channel支持的IO操作,还可以使用ChannelPipeline对Channel中的消息进行处理。...再看下channel中定义的方法: 可以看出channel中定义的方法是多种多样的,这些方法都有些什么特点呢?接下来一一为您讲解。...netty中的Channel是有层级结构的,通过parent属性可获取这种层级结构。...总结 Channel在netty中是做为一个关键的通道而存在的,后面的Event和Handler是以channel为基础运行的,所以说Channel就是netty的基础,好了,今天的介绍到这里就结束了,

    1.2K20

    探索HTTP传输中gzip压缩的秘密

    我们在 http 传输中开启 gZip的目的也是如此,但是一般文章介绍 gZip 时候总是结合一些服务端配置(nginx)或者构建工具插件(webpack)来说,列出一大堆配置让人看的云里雾里,以至于到最后还没搞懂...http 与 gZip 我们下面去探讨一下这些问题 gZip 文件怎么通讯 我们传输压缩文件给别人时候一般都带着后缀名 .rar, .zip之类,对方在拿到文件后根据相应的后缀名选择不同的解压方式然后去解压文件...值得一提的是 ie6的早起版本中存在一个会破坏 gZip的错误,后面 ie6本身在 WinXP SP2 中修复了这个问题,而且用这个版本的用户数量也很少。...nodejs中我们熟悉的express 框架中也有一个compression 中间件,可以开启gZip,一时间看的人眼花缭乱,到底应该用谁怎么用呢?...我们看一些 nginx 中开启 gZip 压缩的一部分配置 # 开启gzipgzip on;# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩gzip_min_length 1k;# gzip

    2.1K20

    Netty中的永动机

    当网络出现拥堵的情况, 或者客户端没有及时处理服务端发给它的数据. 那么服务端的Socket的TCP缓冲区就会被写满, 这个时候再向缓冲区写数据就会失败, Netty就会注册一个写事件....当TCP缓冲区可写的时候, Netty就会继续将之前没有写完的数据,再次向TCP缓冲区写. 如果把Netty的服务端比作一台大型的机器....Netty在进行TCP三次握手的时候, 由于网络等原因, Netty并没有一直等待着连接完成, 客户端在发起连接之后, 便注册了一个连接事件..../netty/issues/924 int ops = k.interestOps(); // 移除连接事件 ops &= ~SelectionKey.OP_CONNECT;...k.interestOps(ops); unsafe.finishConnect(); } 总结: 此篇文件简单说了下Netty作为服务端和客户端的时候, IO线程一直在无限循环着, 傻傻地做着轮询

    20810

    Netty中的ByteBuf详解

    ByteBuf是做什么用的?Netty中传递字节数据的容器。 ByteBuf的使用模式有那些?...使用模式 描述 优点 劣势 堆缓冲区 数据存存储在JVM的堆空间中,又称为支撑数组,通过 hasArray 来判断是不是在堆缓冲区中 没使用池化情况下能提供快速的分配和释放 发送之前都会拷贝到直接缓冲区...直接缓冲区 存储在物理内存中 能获取超过jvm堆限制大小的空间写入channel比堆缓冲区更快 释放和分配空间昂贵(使用系统的方法)操作时需要复制一次到堆上 复合缓冲 单个缓冲区合并多个缓冲区表示 操作多个更方便...另外参数中包含ByteBuf且没有目标索引的[比如 readBytes(ByteBuf dest) writeBytes(ByteBuf dest)],会影响对应的readerIndex(写的方法影响readerIndex...ByteBufAllocator:使用ChannelHandleContext(Channel每个都有不同的实例,或者ChannelHandler获取)能够拿到它的引用,Netty从4.1.x开始默认使用池化

    1.2K10

    netty系列之:JVM中的Reference count原来netty中也有

    netty也是运行在JVM中的,所以JVM中的对象引用计数也适用于netty中的对象。...这里我们说的对象引用指的是netty中特定的某些对象,通过对象的引用计数来判断这些对象是否还被使用,如果不再被使用的话就可以把它们(或它们的共享资源)返回到对象池(或对象分配器)。...ctx.write(message, promise); } } 内存泄露 因为reference count是netty自身来进行维护的,需要在程序中手动进行release,这样会带来一个问题就是内存泄露...为了解决这个问题,默认情况下,netty会选择1%的buffer allocations样本来检测他们是否存在内存泄露的情况....具体的检测选项如下: java -Dio.netty.leakDetection.level=advanced ... 总结 掌握了netty中的引用计数,就掌握了netty的财富密码!

    41820

    Netty中的线程名称

    在之前的文章中我们讨论过NioEventLoop创建过程. 创建的第一个步骤就是创建线程执行器ThreadPerTaskExecutor, 这个线程执行器就是用来创建Netty底层的线程的....而线程的名称对于我们排查问题的时候也是起到很大作用的, 因此我们在设计线程池, 也会根据一定的规则给线程池中的线程命名, 这也是一个好的习惯....在Netty中自然也会给线程池中的线程命名, 接下来我们就分析下它的命名规则. 上面的图中有两个线程池,一个叫bossGroup,另一个叫workerGroup....所以示例nioEventLoop-2-1中的数字1就是表示线程池中的第1个线程, 整体就表示第2个线程池中的第1个线程....备注: 示例nioEventLoop-2-1中的nioEventLoop这个名字是固定的. ---- 实战 接下来我们从实际去看下它们的名字 服务端代码如下 import io.netty.bootstrap.ServerBootstrap

    1.1K30

    Netty中的时间轮

    时间轮是一种可以执行定时任务的数据结构和算法.这篇文章,讲解一下它在Netty 3.x系列中如何实现的,它在4.x系列将在后面的文章中讲解....此次讲解的版本如下 org.jboss.netty netty...K点,Q点)就等于startTime+tickDuration * n 时间轮初始化之后,它的结构如下图 假如此时时间轮正在执行下图中S格子中的任务,这时向时间轮中添加一个延时delay的任务,时间轮会根据当前所处的位置和时刻...HashMap存储任务的,而且每个格子都有一个迭代器,用于迭代HashMap中的任务....,假如当前正在准备执行tick=2的格子中的任务,如果当前时间没有走到deadline时刻,那么线程睡眠,直到时间到达deadline时刻,那么就开始执行格子中的任务(每个格子中的任务都是外部线程提交到时间轮里的

    72820

    netty系列之:netty中的frame解码器

    简介 netty中的数据是通过ByteBuf来进行传输的,一个ByteBuf中可能包含多个有意义的数据,这些数据可以被称作frame,也就是说一个ByteBuf中可以包含多个Frame。...netty为我们提供了一些合适的frame解码器,通过使用这些frame解码器可以有效的简化我们的工作。...为了解决这个问题在DelimiterBasedFrameDecoder中定义了一个ByteBuf的数组: private final ByteBuf[] delimiters; delimiters...FixedLengthFrameDecoder 除了进行ByteBuf中字符比较来进行frame拆分之外,还有一些其他常见的frame拆分的方法,比如根据特定的长度来区分,netty提供了一种这样的decoder...netty中也提供了一个对应的处理decoder: public class LengthFieldBasedFrameDecoder extends ByteToMessageDecoder 读取的逻辑很简单

    56810

    源码分析-Netty:多线程在 Netty 中的应用

    系列文章: 源码分析 -Netty:开篇 一 Netty线程模型 ? 需要注意的是,Netty的线程模型并非固定不变,而是取决于用户的启动参数配置。...通过启动参数的设置,Netty可以支持Reactor单线程模型和多线程模型。...也可以像在Java中,通过单进程-多线程模型来执行多任务并发处理。 线程,作为调度执行单元,比进程更加轻量。...三 Netty的并发编程实践 Netty对并发编程的实践,主要包括以下几个核心内容: 3.1 对共享变量进行正确同步 3.2 正确使用锁 3.3 volatile的正确使用 3.4 CAS指令和原子类...由于各个操作系统的线程调度器实现相差很大,所以依赖JDK自带的线程优先级来设置线程优先级策略的方法,是不可靠的。所以,切记程序不能依赖JDK中自带的线程优先级来试图保证执行顺序、比例和策略。

    67020

    netty系列之:netty中的frame解码器

    简介 netty中的数据是通过ByteBuf来进行传输的,一个ByteBuf中可能包含多个有意义的数据,这些数据可以被称作frame,也就是说一个ByteBuf中可以包含多个Frame。...netty为我们提供了一些合适的frame解码器,通过使用这些frame解码器可以有效的简化我们的工作。...为了解决这个问题在DelimiterBasedFrameDecoder中定义了一个ByteBuf的数组: private final ByteBuf[] delimiters; delimiters...FixedLengthFrameDecoder 除了进行ByteBuf中字符比较来进行frame拆分之外,还有一些其他常见的frame拆分的方法,比如根据特定的长度来区分,netty提供了一种这样的decoder...netty中也提供了一个对应的处理decoder: public class LengthFieldBasedFrameDecoder extends ByteToMessageDecoder 读取的逻辑很简单

    65840
    领券