`

netty学习之ChannelBuffer

阅读更多
    这个类的学习其实我感觉看ChannelBuffer的javadoc就能明白大概,也就是网上说的有readerIndex和writerIndex,以及和这两个相关的
markedReaderIndex和markedWriterIndex,我这里重点看一下discardReadBytes
这个函数的实现吧:

public void discardReadBytes() {
        if (readerIndex == 0) {
            return;
        }
        setBytes(0, this, readerIndex, writerIndex - readerIndex);
        writerIndex -= readerIndex;
        markedReaderIndex = Math.max(markedReaderIndex - readerIndex, 0);
        markedWriterIndex = Math.max(markedWriterIndex - readerIndex, 0);
        readerIndex = 0;
    }


     其实就是将readIndex到writerIndex之间length为writerIndex减去readerIndex的byte拷贝到从0去,这样数据就拷贝过去了。然后变更写指针,因为readerIndex到writerIndex直接的空间就被腾出来了,变更写指针到之前的读指针的位置上。然后解决markedReaderIndex和markedWriterIndex这两个指针的位置,最后将readerIndex设置为0.其他的方法理解起来都比较好理解一些。
      ChannelBufferIndexFinder这个接口比较特殊,感觉就是查找是否已经到了某些特殊字符了,比如\r和\n等等,这个对消息的截取等比较有帮助。
      ChannelBufferOutputStream类是将对BufferChannel封装成一个OutputStream,同样的
也有ChannelBufferInputStream类。

分享到:
评论
2 楼 asialee 2013-11-22  
谢谢,我再看一下,不过我看的是netty3的源码,我再确认一下,非常感谢。

jd2bs 写道
你的这句描述是有问题的:“变更写指针到之前的读指针的位置上”跟源代码是不一样的
writerIndex -= readerIndex;

事实上 写指针被变更到readable bytes length的值得位置上

discardReadBytes()方法的作用是 释放discardable区域
比如原先readerIndex=5, writerIndex=9, capacity=14

调用此方法后readerIndex=0, writerIndex=4, 因此现在可写bytes length=10了


markedReaderIndex又是干嘛用的呢? 其实就是字面意义:做标记用的,以便reset时知道该回到哪个位置

请看源码:

public void markReaderIndex() {
        markedReaderIndex = readerIndex;
    }

    public void resetReaderIndex() {
        readerIndex(markedReaderIndex);
    }

    public void markWriterIndex() {
        markedWriterIndex = writerIndex;
    }

    public void resetWriterIndex() {
        writerIndex = markedWriterIndex;
    }

1 楼 jd2bs 2013-11-21  
你的这句描述是有问题的:“变更写指针到之前的读指针的位置上”跟源代码是不一样的
writerIndex -= readerIndex;

事实上 写指针被变更到readable bytes length的值得位置上

discardReadBytes()方法的作用是 释放discardable区域
比如原先readerIndex=5, writerIndex=9, capacity=14

调用此方法后readerIndex=0, writerIndex=4, 因此现在可写bytes length=10了


markedReaderIndex又是干嘛用的呢? 其实就是字面意义:做标记用的,以便reset时知道该回到哪个位置

请看源码:

public void markReaderIndex() {
        markedReaderIndex = readerIndex;
    }

    public void resetReaderIndex() {
        readerIndex(markedReaderIndex);
    }

    public void markWriterIndex() {
        markedWriterIndex = writerIndex;
    }

    public void resetWriterIndex() {
        writerIndex = markedWriterIndex;
    }

相关推荐

    Netty实现原理浅析

    ### Netty实现原理浅析 #### 一、总体结构 Netty是一款由JBoss推出的高效且功能丰富的Java NIO框架,旨在简化网络...无论是对于初学者还是经验丰富的开发者而言,Netty都是一款值得深入学习和使用的网络编程框架。

    netty3.1中文用户手册

    - **缓冲区管理**:Netty 的缓冲区管理机制是其高性能的关键之一,它允许开发者高效地处理数据。 - **异步 I/O 模型**:Netty 基于 NIO 实现,支持异步非阻塞的 I/O 操作,大大提高了网络应用的吞吐量。 - **事件...

    Netty教程用户手册

    - **1.8 使用POJO代替`ChannelBuffer`**:学习如何使用普通的Java对象(POJOs)代替`ChannelBuffer`进行数据处理。 - **1.9 应用程序关闭**:了解如何优雅地关闭Netty应用程序。 - **1.10 总结**:回顾本章所学的...

    Netty_3.2_中文用户手册

    该手册由张立明翻译,Princy 进行了二次整理,对于学习和使用 Netty 框架的初学者,特别是学生来说,是一份宝贵的资源。 在手册的前言部分,作者提出了网络通信中常见的问题:通用的协议和库在特定场景下可能存在...

    netty权威指南第二版源码

    7. **Codec**:Netty 提供了一系列编解码器,用于将各种协议数据转换为 ChannelBuffer 和反向操作,如 HTTP、TCP、UDP 等。 通过对“Netty 权威指南第二版源码”的学习,你可以: - 理解 Netty 的事件模型和线程...

    netty-3.2.5终极手册

    ### Netty 3.2.5 终极手册:关键知识点概述 #### 一、Netty 3.2.5 终极手册...通过学习《Netty-3.2.5终极手册》,读者不仅可以掌握Netty的核心技术,还能学会如何利用Netty来解决实际问题,开发出高效可靠的网络应用。

    Netty 3.1中文用户手册

    Netty 是一个专门为快速开发高性能、高可靠性网络应用而设计的 Java 框架。它提供了异步事件驱动的网络应用程序框架,...随着深入学习和实践,开发者将能更好地利用 Netty 的优势,构建出高效、可靠的网络应用程序。

    netty3.1中文用户手册.pdf

    ### Netty 3.1 中文用户手册关键知识点解析 #### 序言 - **Netty的意义**:本节...通过以上知识点的详细解析,读者可以更加深入地理解Netty 3.1的核心理念和具体实现细节,为进一步学习和实际应用奠定坚实的基础。

    Netty 3.1 中文用户手册

    - 统一的 API 设计,降低了学习曲线。 - 支持多种协议(FTP、SMTP、HTTP 等),同时也方便自定义协议的实现。 - 内置了多种高级功能模块,如编解码器、SSL/TLS 加密支持等。 #### 第一章 开始 - **准备工作**: ...

    Netty3.1中文用户手册.doc

    通过学习Netty 3.1中文用户手册,开发者可以深入了解Netty的架构,掌握其设计原则,以及如何利用Netty构建高性能的网络应用程序。无论是对于新手还是有经验的开发者,Netty都能提供一个高效、稳定且易于扩展的网络...

    Netty那点事(2)Netty中的bufferJava开

    6. **零拷贝**:Netty通过直接内存和ChannelBuffer的组合,实现了操作系统级别的零拷贝技术,有效降低了CPU的负载,提升了网络传输效率。 7. **安全性**:ByteBuf还提供了安全的边界检查,防止越界访问导致的运行时...

    netty 新NIO框架 文档

    ### Netty新NIO框架知识点概述 #### 一、Netty框架简介 Netty是一款高性能的网络应用开发框架,它采用事件驱动...无论是构建高性能的服务端应用还是处理复杂的网络协议,Netty都是一个值得深入学习和使用的强大工具。

    netty3.1中文手册

    通过阅读 Netty 3.1 中文手册,开发者可以学习到如何利用 Netty 构建高效的网络应用,理解其设计原理,并掌握实际开发中的关键技巧。Netty 的灵活性和高性能使其成为 Java 平台上构建网络服务的理想选择,无论是在...

    netty documentation

    - **使用POJO代替`ChannelBuffer`**:Netty允许开发者使用普通的Java对象(POJOs)来表示数据,而不是使用`ChannelBuffer`。这种做法有助于提高代码的可读性和可维护性。 #### 四、总结 通过本篇文档,我们可以...

    Netty user guid

    - **1.8 使用 POJO 而不是 ChannelBuffer**:这里介绍了如何使用普通的 Java 对象 (POJO) 来代替 ChannelBuffer 进行数据处理。 - **1.9 关闭你的应用程序**:讲解如何优雅地关闭 Netty 应用程序。 - **1.10 总结**...

    netty参考文档

    通过对 Netty 的深入学习与实践,开发者不仅可以提高自身的技术水平,还能更好地应对各种复杂网络应用的需求。无论是对于初学者还是有经验的开发人员来说,掌握 Netty 都是一项非常有价值的技能。

    netty4.0中的新变化和注意点鸟窝.pdf

    Netty 是一个高性能、异步事件驱动的...总的来说,Netty 4.0 的这些变化提升了框架的性能,简化了 API,降低了学习曲线,并提供了更强大的功能。对于开发者来说,理解这些变化是成功迁移和利用 Netty 4.0 功能的关键。

Global site tag (gtag.js) - Google Analytics