首页 > 其他分享 >Netty数据传输载体ByteBuf

Netty数据传输载体ByteBuf

时间:2024-06-12 17:33:01浏览次数:18  
标签:Netty writerIndex ByteBuf System byteBuf println 数据传输 out

原文链接:https://www.cnblogs.com/wuweishuo/p/10854421.html

Netty中读写以ByteBuf为载体进行交互

ByteBuf的结构

  1. ByteBuf以readerIndex和writerIndex划分为三块区域,废弃字节,可读字节,可写字节。每次从ByteBuf读取一个字节时readerIndex+1,写入一个字节时writerIndex+1。
  2. 废弃字节,这部分的数据是无效的,范围为0~readerIndex-1
  3. 可读字节,从ByteBuf读取的数据都来自这块区域,范围为readerIndex~writerIndex-1,当readerIndex与writerIndex相等时不可读。
  4. 可写字节,写入的数据存放的区域,范围为writerIndex~capacity,当capacity与writerIndex相等时不可写,但是ByteBuf还有一个maxCapacity,容量不足时可以进来扩容,当容量超过maxCapacity时会报错。

读取

	ByteBuf byteBuf = Unpooled.copiedBuffer("hello world".getBytes());
    //判断是否有可读的字节
    System.out.println(byteBuf.isReadable());
    //返回可读字节数
    System.out.println(byteBuf.readableBytes());
    //返回当前的读指针
    System.out.println(byteBuf.readerIndex());
    while (byteBuf.isReadable()) {
        //以read开头的方法都是读取方法,readInt、readBoolean等
        byteBuf.readByte();
    }
    System.out.println(byteBuf.readerIndex());
    //设置读指针
    byteBuf.readerIndex(0);
    //将当前可读数据都读取到byte[]中
    byteBuf.readBytes(new byte[byteBuf.readableBytes()]);

写入

	//分配capacity为9,maxCapacity为12的byteBuf
    ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(9, 12);
    //返回可写字节数
    System.out.println(byteBuf.writableBytes());
    //判断是否可写
    System.out.println(byteBuf.isWritable());
    //以write开头的都是写入方法
    byteBuf.writeByte(1);
    byteBuf.writeInt(1);
    byteBuf.writeBytes(new byte[]{1,2,3,4});
    //获取写指针
    System.out.println(byteBuf.writerIndex());
    //这时writerIndex==capacity
    System.out.println(byteBuf.writableBytes());
    System.out.println(byteBuf.isWritable());
    //再写入将扩容
    byteBuf.writeByte(1);
    System.out.println(byteBuf.isWritable());
    System.out.println(byteBuf.writableBytes());
    //扩容后仍然不足存放将报错
    //byteBuf.writeInt(1);
    //设置写指针
    byteBuf.writerIndex(0);
    System.out.println(byteBuf.isWritable());
    System.out.println(byteBuf.writableBytes());
    byteBuf.writeInt(1);

引用计数

release() 与 retain()
  1. netty使用的是堆外内存,不被jvm管理,所以需要我们手动释放。
  2. netty使用引用计数管理ByteBuf,如果没有地方引用一个ByteBuf,将直接回收底层内存。
  3. 一个ByteBuf被创建时引用为1,retain()将使引用+1,release()使引用-1,为0时将被回收。
  4. 一般遵循谁retain()(包括创建)谁release()

slice()、duplicate()、copy()

  1. slice()截取可读字节区域返回,新的ByteBuf的maxCapacity为旧的readableBytes(),但底层内存和引用共用
  2. duplicate()为ByteBuf的浅拷贝,读写指针与旧的无关,但底层内存和引用共用
  3. copy()为深拷贝,读写指针、引用和内存都无关
  4. slice()和duplicate()不会增加引用计数,而retainedSlice() 与 retainedDuplicate()会增加计数。

参考资料

Netty实战
Netty 入门与实战:仿写微信 IM 即时通讯系统

标签:Netty,writerIndex,ByteBuf,System,byteBuf,println,数据传输,out
From: https://www.cnblogs.com/fswhq/p/18193940

相关文章

  • Netty--聊天业务
    1.聊天模块细分微服务:用户服务:处理用户身份验证、授权和管理。包括用户注册、登录、个人信息管理等功能。聊天服务:处理实时聊天功能,包括消息发送、接收和存储。可使用WebSocket等技术来实现实时通信。好友服务:管理用户的好友关系,包括好友请求、好友列表和好友关系的维护。群组服......
  • 如何通过加密U盘 实现数据传输闭环管控?
    加密U盘是用来保护存储在其中数据的安全的。通过加密技术,用户可以将其敏感文件和信息存储在U盘中,并设置密码或使用其他加密方法来防止未经授权的访问。这种安全措施可以防止数据泄露或盗窃,特别是在丢失或被盗的情况下,确保数据不会落入他人手中。许多不同类型的企业和组织可能会......
  • 思科配置基础代码内容针对网络构建中型局域网构建中型局域网需全面考虑企业网或校园网
    构建中型局域网需全面考虑企业网或校园网的需求。对于企业网,需确保高效数据传输、可靠设备连接及严格的安全防护;而校园网则需关注教学管理的便捷性、无线网络的覆盖以及未来扩展的灵活性。整体而言,构建与扩展需围绕用户需求、网络性能及安全性展开。一、配置三层交换机的端口......
  • 美团面试:说说Netty的零拷贝技术?
    零拷贝技术(Zero-Copy)是一个大家耳熟能详的技术名词了,它主要用于提升IO(Input&Output)的传输性能。那么问题来了,为什么零拷贝技术能提升IO性能?1.零拷贝技术和性能在传统的IO操作中,当我们需要读取并传输数据时,我们需要在用户态(用户空间)和内核态(内核空间)中进行数据拷贝,它的执......
  • Netty 快速入门
    什么是NettyNetty的官网:[https://netty.io/Netty是一个JavaNIO技术的开源异步事件驱动的网络编程框架,用于快速开发可维护的高性能协议服务器和客户端。往通俗了讲,可以将Netty理解为:一个将JavaNIO进行了大量封装,并大大降低JavaNIO使用难度和上手门槛的网络编程框架。Net......
  • STM32: DMA数据传输学习
    一.DMA简介DMA(DirectMemoryAccess)直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。相当于CPU的数据传输小助手。二.DMA功能特性如图,有三个DMA通道,分别是......
  • Netty线程模型
    在Netty编程模型入门案例中客户端和服务端通信底层如何实现的呢?先看客户端和服务端的类图:两类图大致一样,区别在于ServerBootstrap与EventLoopGroup是组合关系,而Bootstrap与EventLoopGroup之间没有直接的关系。实际在......
  • 面试官:说说Netty对象池的实现原理?
    Netty作为一个高性能的网络通讯框架,它内置了很多恰夺天工的设计,目的都是为了将网络通讯的性能做到极致,其中「对象池技术」也是实现这一目标的重要技术。1.什么是对象池技术?对象池技术是一种重用对象以减少对象创建和销毁带来的开销的方法。在对象池中,只有第一次访问时会创建对......
  • Netty编程模型入门案例
    在Socket编程模型可以看到发送数据和响应数据直接涉及到的是I/O模型,基于TCP/IP的socket编程使用的是流套接字。那什么是I/O模型呢?简单的理解就是用什么样的通道进行数据的发送和接收——这很大程度上决定了程序通信的性能。下面介绍另一种编程模式——Netty框架的入门案......
  • Java 开发面试题精选:Netty 一篇全搞定
    前言在面试Java开发工程师时,技术面试官不仅会考察候选人对Netty理论知识的掌握程度,还会考察其实际应用能力和问题解决技能。在本篇文章精选的关于Netty的面试题目中,从基础到实战再到一些问题的处理分析,都有所覆盖,能较为全面评估出候选人对Netty的理解和应用能力。如果你......