netty中ByteBuf的基本使用

Netty入门-Bytebuf 前言 在网络上传输的数据总是以字节为单位,Java NIO使用ByteBuffer作为字节的容器,使用起来比较繁琐与复杂。Netty使用ByteBuf作为ByteBuffer的替代品,但又具备ByteBuffer的功能且功能更强大。 ByteBuf ByteBuf将会是使用Netty框架开发网络程序中使用频率较高的工具之一;Netty的数据处理通常由ByteBuf与ByteBufHolder这两个组件完成。下面先来看看ByteBuf的一些优点: 通过内置的复合缓冲区类型实现了透明的零拷贝 容量可以按需要增 阅读详情

1、导入netty的jar包


使用ByteBuf必须导入下面的两个包
netty-buffer-*.*.*.Final.jar
netty-common-*.*.*.Final.jar

jar下载地址
https://netty.io/downloads.html

 

2、基本使用


2.1 ByteBuf初始化


ByteBuf buf = Unpooled.buffer(10);
ByteBuf newBuf = Unpooled.buffer(4);
// buf是否可读,返回boolean
buf.isReadable()
// buf是否可写,返回boolean
buf.isWritable()
// buf可以读的字节数
buf.readableBytes()
// buf可以写的字节数
writablesBytes()
// buf当前read索引
buf.readerIndex()
// buf当前write索引
buf.writerIndex()

2.2 ByteBuf写字节

ByteBuf写1个字节
方法1:writeByte(int value)
// 将value写入Buf中,写索引自动加1
buf.writeByte(value);
方法2:setByte(int index, int value)
// 更改buf的index位置的值为value
buf.setByte(index, value);


ByteBuf写多个字节
方法1:writeBytes(ByteBuf src,int srcIndex,int length)
// 从newBuf的srcIndex位置,读取length个值写入buf中,写索引自动加length
buf.writeBytes(newBuf,srcIndex,length)
方法2:setBytes(int index, ByteBuf src, int srcIndex, int length)
// 将buf中从index以后,更改为newBuf中从srcIndex的length个值,注意索引不要越界
buf.setBytes(index, newBuf, srcIndex, length)


2.3 ByteBuf读字节

ByteBuf读1字节
方法1:readByte()
// 读取ByteBuf,读索引自动加1
buf.readByte()
方法2:getByte(int index)
// 获得buf的index位置的字节
buf.getByte(index)

ByteBuf读多个字节
方法1:readBytes(ByteBuf src, long position, int length)
// 从newBuf中读取length个值,从buf的position位置处插入,读索引自动加length,注意:不要越界
newBuf.readBytes(buf, position, length)

方法2:getBytes(int index, ByteBuf src, long position, int length)
// 从buf中index位置开始读取length个字节,从newBuf的position位置写入,注意:newBuf要能足够存储length个字节
buf.getBytes(index, newBuf, position, length)


3、实例


package test;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;

public class Test {
    public static void main(String[] args) {
        
        // 初始化        
        ByteBuf buf = Unpooled.buffer(10);
        ByteBuf newBuf = Unpooled.buffer(4);
        
        /*
        for(int i=0;i<buf.capacity(); i++) {
            
            // 写入ByteBuf,写索引自动加1
            buf.writeByte(i);
            
            // 读取ByteBuf,读索引自动加1
            System.out.println(buf.readByte());
            
            System.out.println(buf.readableBytes());
            System.out.println(buf.writableBytes());
            System.out.println(buf.readerIndex());
            System.out.println(buf.writerIndex());
        }
        */
        
        
        /*
        for(int j=0; j<newBuf.capacity(); j++) {
            newBuf.writeByte(j);
        }
        
        // 从newBuf的1位置开始,读2个字节,写入到buf中
        buf.writeBytes(newBuf, 1, 2);
        
        // 从buf的5位置处写入,从newBuf的1位置开始的3个字节,
        buf.setBytes(5, newBuf, 1, 3);
        
        for(int j=0; j<buf.capacity(); j++) {
            System.out.print(buf.getByte(j)+"  ");
        }
        */
        
        /*        
        for(int i=0;i<newBuf.capacity(); i++) {
            newBuf.writeByte(i);
        }
        
        // 从newBuf中读4个字节,从buf的5位置处插入
        newBuf.readBytes(buf, 5, 2);
        
        for(int j=0; j<buf.capacity(); j++) {
            System.out.print(buf.getByte(j)+"  ");
        }
        
        */
        
        for(int i=0;i<buf.capacity(); i++) {
            buf.writeByte(i);
        }
        
        // 从buf的5位置处,开始读4个字节,从newBuf的0位置写入
        buf.getBytes(5, newBuf, 0, 4);
        
        for(int j=0; j<newBuf.capacity(); j++) {
            System.out.print(newBuf.getByte(j)+"  ");
        }
        
    }
}

ByteBuf使用详解:ByteBuff组成、扩容、retain、release、零拷贝(slice、duplicate、compositeByteBuf、unpolled)、深拷贝。 ByteBuf是对字节数据的封装。是netty的Server与Client之间通信的数据传输载体(Netty的数据容器),它提供了一个byte数组(byte[])的抽象视图,既解决了JDK API的局限性,又为网络应用程序的开发者提供了更好的API。ByteBuf使用详解:ByteBuff组成、扩容、retain、release、零拷贝(slice、duplicate、compositeByteBuf、unpolled)、深拷贝。 阅读详情

相关推荐

【Netty4】netty ByteBuf(三)如何释放ByteBuf

谁来负责Release?在Netty里,因为Handler链的存在,ByteBuf经常要传递到下一个Hanlder去而不复还,所以规则变成了谁是最后使用者,谁负责释放。另外,更要注意的是各种异常情况,ByteBuf没有成功传递到下一个Hanlder,还在自己地界里的话,一定要进行释放。根据谁最后谁负责原则,每个Handler对消息可能有三种处理方式 对原消息不做处理,调用 ctx.fireCha...

m0_45406092的博客 8249

netty轻松入门(四)—— 数据容器ByteBuf

数据在网络中是以二进制形式传输的,在java中我们使用字节数组来表示。 在使用netty开发时,你会发现netty使用ByteBuf将字节数组包装起来,ByteBuf是netty中的数据容器,一切针对数据的操作以ByteBuf为基础 JDK中也有字节数组的容器类ByteBuffer。但ByteBuffer有一些缺陷: 无法支持同时读写数据,从读切换到写,或从写切换到读时,需要手动调用flip()方法重置一下。 字节数组长度固定,无法扩容 因此netty才开发了ByteBuf,弥补了ByteBuffer的

君君的专栏 1160

博途的HMI(触摸屏)的应用

触摸屏(HMI):用于控制PLC,可认为是小型上位机(用于控制PLC的都可认为是上位机)上位机(PC Station):将触摸屏升级为电脑----工控机(工业控制的机器)用博途编写西门子的触摸屏和上位机。

王阿妹小天才的博客 2676

ByteBuff常用方法,使用

ByteBuff常用方法,使用

一点光辉的博客 1万+

Autosar Os降低CPU负载的方案总结

由于各个项目的实际场景不尽相同,可能需要有针对性的对症优化。如果你还有别的一些优化手段欢迎留言交流。

3678

C# 实现鼠标轨迹录制与回放自动化功能(附源码)

通过本文的介绍,相信大家已经掌握了鼠标轨迹录制与回放功能的实现方式。该功能在自动化测试和重复性工作中具有重要应用价值。后续可以进一步优化,增加更多扩展功能,形成一个完整的自动化工具。

weixin_72139050的博客 1755

Netty学习——源码篇10 Netty内存分配ByteBuf基础

ByteBuf是Netty整个结构中最为底层的模块,主要负责把数据从底层I/O读取到ByteBuf,然后传递给应用程序,应用程序处理完成后再把数据封装成ByteBuf写回I/O。所以,ByteBuf是直接与底层打交道的一层抽象。

geminigoth的博客 1672

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

【WorkBuddy专栏25】如何选择大模型——积分消耗、用途场景、选型决策全指南

AI人人懂 940

【Netty4】netty ByteBuf (一)如何创建ByteBuf对象

有一点我们需要知道的是,ByteBuf的jar包,是可以单独使用的。比如某个项目中有一个场景,需要处理某个自定义的协议,那么我们在解析协议时,就可以将接收到的将字节内容写入一个ByteBuf,然后从ByteBuf中慢慢的将内容读取出来。下面让我们用一个例子简单的了解下ByteBuf的使用。 ByteBuf的创建 要想使用ByteBuf,首先肯定是要创建一个ByteBuf,更确切的说法就是要申请一块...

m0_45406092的博客 6124

YOLOv10改进,YOLOv10二次创新C2f结构采用WTConv卷积(感受野的小波卷积),ECCV 2024

WTConv 的核心思想是通过结合卷积神经网络(CNN)的强大特征提取能力与小波变换的多尺度特性,来实现大感受野的卷积操作,同时避免传统大卷积核带来的参数爆炸问题。传统的卷积操作通过滑动小窗口在图像上逐步执行局部特征提取,感受野的大小直接取决于卷积核的尺寸。随着卷积核的增大,参数量呈指数增长,导致网络训练效率降低、计算资源消耗增加。为解决这些问题,WTConv 提出了在小波域中执行卷积操作的策略。小波变换是一种常用于信号处理的技术,能够将信号分解为不同频率成分。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1024

2024年数字IC秋招-大疆-数字芯片开发工程师-笔试题

笔试题型:选择题 + 简答题笔试平台:大疆创新(电脑监控)笔试时间:90min做题感受:知识面覆盖很广,很多题目不会做(1) 什么是功耗优化中的DVFS技术?(2)降低功耗的原理是什么?(3)一般工作流程是怎样的?(4)必须的硬件模块有哪些?

qq_42135020的博客 2667

Netty中ByteBuf的使用

根据 Netty 官方测试,池化技术在高并发场景下相比非池化技术可提升约 20%~30% 的吞吐量,同时显著降低 GC 频率和延迟。实例,显著减少了 Java 堆内存的分配和垃圾回收(GC)压力,从而提升了系统的吞吐量和响应速度。是一个抽象的、可随机和顺序访问的零个或多个字节的序列。的生命周期,可以充分发挥 Netty 的性能优势,同时避免内存泄漏和应用崩溃。时,会优先从本地缓存中获取,避免跨线程锁竞争,提高分配速度。实例,避免了上述问题,提高了内存使用效率和系统性能。被正确释放,以避免内存泄漏。

eclipseC的博客 1710

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

2025年CSP-J复赛真题及题解:T4 多边形(polygon)

王老师青少年编程 1718

Netty详解ByteBuf

目录 1 工作原理 2 基本使用 2.1 读取操作 2.2 写入操作 2.4 clear() 3 ByteBuf 使用模式 4 ByteBuf 的分配 5 ByteBuf的释放 5.1、⼿动释放 5.2 自动释放 5.2.1 TailHandler 5.2.2 SimpleChannelInboundHandler 5.2.3 HeadHandler 5.3 小结 1 工作原理 Java NIO 提供了ByteBuffer 作为它 的字节容器,但是这个类使⽤起来过于复杂,⽽且也有些繁琐。

赵广陆 4788

自私兽群优化器(SHO)详解:从生物本能到智能优化

自私兽群优化器(SHO)是一种受动物群体自私行为启发的智能优化算法。该算法模拟动物在捕食威胁下的两种行为:聚集行为(全局搜索)和自私行为(局部搜索),将优化问题的解空间映射为生存环境,候选解视为猎物个体。SHO通过安全性评估将猎物分为安全、危险和高危三类,分别采用不同的位置更新策略,并引入捕食者角色增加选择压力。相比传统优化算法,SHO具有无需梯度信息、自适应平衡探索与开发、参数简单等优势,特别适合高维复杂和多模态优化问题。算法通过马尔可夫链理论保证收敛性,已在工程设计和数据挖掘等领域展现出良好性能。

qq_42212808的博客 196

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Netty笔记(九)之ByteBuf使用详解

文章目录netty版本简介API详解索引变化图创建访问API方法辅助类CompositeByteBufByteBufHolderByteBufAllocatorUnpooledByteBufUtil零拷贝转化为已存在的JDK类型Byte ArrayNIO Buffers netty版本 netty版本:io.netty:netty-all:4.1.33.Final 简介 网络数据的基本单位总...

jannal专栏 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

netty之ByteBuf的使用与分类介绍

ByteBuf 当我们使用NIO进行数据传输的时候,往往需要使用到缓冲区Buffer,常用的缓冲区就是JDK中的NIO类库提供的java.nio.Buffer。 实际上,7种基本类型(Boolean除外)都有自己的缓冲区实现。对于NIO编程而言,我们主要使用的是ByteBuffer。从功能角度而言,ByteBuffer完全可以满足NIO编程的需要,但是由于NIO编程的复杂性,ByteBuffer也有其局限性,它的主要缺点如下: ByteBuffer长度固定,一旦分配完成,它的容量不能动态扩展和收缩(Buf

morris 4933

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

netty系列之:netty中的ByteBuf详解

netty中用于进行信息承载和交流的类叫做ByteBuf,从名字可以看出这是Byte的缓存区,那么ByteBuf都有哪些特性呢?一起来看看。

程序那些事 7153

【netty】 ByteBuf的常用API总结

一、创建 1、池化创建 ByteBufAllocator 获取ByteBufAllocator Channel channel = ...;ByteBufAllocator allocator = channel.alloc(); //1....ChannelHandlerContext ctx = ...;ByteBufAllocator allocator2 = ctx.allo

qq_26680031的博客 1万+

Netty中的ByteBuf详解

把书读薄(Netty In Action 第五章)ByteBuf是做什么用的?Netty中传递字节数据的容器。ByteBuf的使用模式有那些?使用模式描述  优点 劣势堆缓冲区数据存存储在JVM的堆空间中,又称为支撑数组,通过 hasArray 来判断是不是在堆缓冲区中 没使用池化情况下能提供快速的分配和释放 发送之前都会拷贝到直接缓冲区直接缓冲区 存储在物理内存中能获取超过jvm堆限制大小的空间...

爬蜥 7495

Netty入门——ByteBuf

Netty入门——ByteBuf

小志的博客 1233

netty byteBuf使用

package com.wang.wzrtunetty; import org.apache.cassandra.cli.CliParser.newColumnFamily_return; import com.wang.util.ByteUtil; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufAllocatorMetricProvider;

fivestar2009的博客 3141

netty源码之ByteBuf详解

一、背景简介 ByteBuf,顾名思义,就是字节缓冲区,是Netty中非常重要的一个组件。熟悉jdk NIO的同学应该知道ByteBuffer,正是因为jdk原生ByteBuffer使用比较复杂,某些场景下性能不是太好,netty开发团队重新设计了ByteBuf用以替代原生ByteBuffer。 二、ByteBuf和ByteBuffer对比 下面用图示来展示ByteBuf和ByteBuffer工作原理: ①、ByteBuffer ByteBuffer依靠flip()来切换模式,在读模式下..

bobozai86的博客 9625

Netty详解之九:使用ByteBuf

上一章介绍了几种典型ByteBuf的原理,这一章介绍它的使用方法,包括Netty是如何使用ByteBuf的。 引用计数 上一章已经提及“引用计数”的概念;引用及计数是一种历史悠久的对象生命周期管理手段。它的核心理念是在对象上增加一个int字段来维护对象“拥有者的数量”,每当对象增加一个拥有者,引用计数加一,反之减一;对象创建之初引用计数等于1,引用计数变成0的那一刻立刻释放。 ByteBuf从ReferenceCounted接口继承,后者定义了引用计数的概念抽象。 public interface Refe

longhuihu的专栏 3508

Netty ByteBuf

本章讲包括: ByteBuf —— Netty 的数据容器(data container) API 详情 使用样例 内存分配 如前所述,网络数据的基本单位始终是字节。 Java NIO提供了ByteBuffer作为其字节容器,但是这个类使得使用过于复杂并且使用起来有点麻烦。 Netty替代ByteBuffer的是ByteBuf,这是一个强大的实现,可以解决JDK API的局限性,并为网络应用程...

五石之瓠 以为大樽 浮于江湖 悠笑人生 1324

Netty从0到1系列之ByteBuf【中】

摘要: 本文是《Netty从0到1系列》关于ByteBuf的中篇,重点介绍ByteBuf的核心API与基础操作。通过代码示例演示了ByteBuf的创建、数据写入(含自动扩容)、读取、标记重置、搜索等核心功能,并展示了读写过程中的索引变化。文章强调使用后需释放资源,为后续高级特性讲解奠定基础。该系列已涵盖I/O模型、NIO、Selector等Netty核心组件,本篇是深入理解Netty数据缓冲机制的关键章节。

编程技术圈 1586
上一篇: Android自定义监听器
下一篇: SVM数学基础推导
MasonYyp
博客等级 码龄9年 301粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值