ByteBuf 笔记

/**
 * Netty 内存分配容器 ByteBuf
 */
public class ByteBufDemo {

    public void doAlloc(ChannelHandlerContext ctx, UserModel userModel) {
        // 初始化容器内存大小,
        ByteBuf byteBuf = ctx.alloc().directBuffer().capacity(1024);
        /**
         * 经验表明,Bytebuf的最佳实践是在IO通信线程的读写缓冲区使用DirectByteBuf,后端业务使用HeapByteBuf
         */
//        ByteBuf byteBurWriter = ctx.alloc().directBuffer().writeBytes(userModel.getProtoData().toByteArray);

    }

    public static void main(String[] args) throws Exception {
//        testUnpooledHeapBuffer();
//        testUnpooledDirectBuffer();
        testComposite();

    }

    // 直接缓冲区
    public static void testUnpooledDirectBuffer() throws Exception {
        // 未池化的直接缓冲区
        ByteBuf directBuffer = Unpooled.directBuffer(100);
        directBuffer.writeBytes("directBUffer".getBytes());
        //检查 ByteBuf 是否由数组支撑。如果不是,则这是一个直接缓冲区,是数组则应该放在堆内存
        if (!directBuffer.hasArray()) {
            int length = directBuffer.readableBytes();
            byte[] array = new byte[length];
            /**
             * 先读取两个字节
             * 结果如下: [114, 101, 99, 66, 85, 102, 102, 101, 114, 0, 0]
             * 11
             */
            directBuffer.readerIndex(2);
            /**
             * 将字节复制到数组
             * 未读取之前结果如下: [100, 105, 114, 101, 99, 66, 85, 102, 102, 101, 114]
             */
            directBuffer.getBytes(directBuffer.readerIndex(), array);
            System.out.println(Arrays.toString(array));
            System.out.println(length);
        }
    }

    // 堆缓冲区
    public static void testUnpooledHeapBuffer() {
        ByteBuf heapBuf = Unpooled.copiedBuffer("heap buffer", CharsetUtil.UTF_8);
        if (heapBuf.hasArray()) {
            byte[] array = heapBuf.array();
            int offerset = heapBuf.arrayOffset() + heapBuf.readerIndex();
            int length = heapBuf.readableBytes();

            System.out.println(Arrays.toString(array));
            System.out.println(offerset);
            System.out.println(length);
            /**
             * 结果如下:
             * [104, 101, 97, 100, 32, 98, 117, 102, 102, 101, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
             * 0
             * 11
             */
        }
    }

    /**
     * 复合缓冲区
     * Netty 通过一个 ByteBuf 子类——CompositeByteBuf——实现了组合模式,它提供了一
     *  个将多个缓冲区表示为单个合并缓冲区的虚拟表示
     */
    public static void printCompositeBuf(CompositeByteBuf compbuf) {
        // 可读字节数
        int length = compbuf.readableBytes();
        byte[] array = new byte[length];
        compbuf.getBytes(compbuf.readerIndex(), array);
        System.out.println("array: " + Arrays.toString(array));
        System.out.println("length: " + length);
    }

    public static void testComposite() {
        // 复合缓冲区
        CompositeByteBuf messageBuf = Unpooled.compositeBuffer();
        ByteBuf headBuf = Unpooled.directBuffer(1024);
        headBuf.writeBytes("head buffer".getBytes(StandardCharsets.UTF_8));
//        ByteBuf headBuf = Unpooled.copiedBuffer("head buffer", StandardCharsets.UTF_8);
        ByteBuf bodyBuf = Unpooled.copiedBuffer("body buffer", StandardCharsets.UTF_8);

        //
        messageBuf.addComponents(headBuf, bodyBuf);
        System.out.println("headBuf 可读字节数: " + headBuf.readableBytes());
        System.out.println("BodyBuf 可读字节数: " + bodyBuf.readableBytes());
        System.out.println("messgeBuf可读字节数:  " + messageBuf.readableBytes());
        System.out.println("remove head before -------------");

        printCompositeBuf(messageBuf);

        for (ByteBuf buf : messageBuf) {
            System.out.println(buf.toString(StandardCharsets.UTF_8));
        }

        // 根据数组下标删除元素
        messageBuf.removeComponent(0);

        System.out.println("remove head after-------------");

        printCompositeBuf(messageBuf);

        for (ByteBuf buf : messageBuf) {
            System.out.println(buf.toString(StandardCharsets.UTF_8));
        }

        /**
         * 结果如下:
         * headBuf 可读字节数: 11
         * BodyBuf 可读字节数: 11
         * messgeBuf可读字节数:  0
         * remove head before -------------
         * array: []
         * length: 0
         * head buffer
         * body buffer
         * remove head after-------------
         * array: []
         * length: 0
         * body buffer
         */
    }

}

待完善

<think>好的,我需要帮助用户获取关于Netty的全面学习资料或教程。首先,我需要回顾用户提供的引用内容,看看有哪些现有的资源可以整合。 用户提供了五个引用,其中引用[1]和[2]提到了尚硅谷的Netty系列学习笔记,包括BIO、NIO、AIO的介绍以及代码示例。引用[3]详细描述了Netty客户端的初始化步骤和关键组件,引用[4]和[5]讨论了NIO的优势以及Reactor模型的优缺点。这些引用内容虽然分散,但可以作为构建学习路径的基础。 接下来,我需要按照用户的要求,将回答结构化,分步骤说明。用户需要全面的学习资料,所以应该涵盖基础概念、核心组件、实践资源和进阶内容。同时,必须确保所有数学公式和独立公式符合规定的格式,但在这个主题中可能数学内容较少,主要集中在代码示例和技术术语上。 需要检查是否每个引用都被恰当地引用,并在末尾添加标识。例如,在介绍BIO/NIO时引用[1][4],在讲解Netty组件时引用[2][3],在讨论线程模型时引用[5]。 然后,生成相关问题。用户示例中的相关问题涉及性能分析、优化方法和应用场景,我需要针对Netty提出类似的问题,比如学习路径、核心组件的作用、线程模型的选择等。 最后,确保回答符合中文要求,结构清晰,语言自然,避免使用Markdown格式,用口语化的表达,同时保持专业性。需要确认所有引用标记正确,没有遗漏,并且链接到对应的引用来源。</think>### Netty全面学习路径指南 #### 一、基础理论准备 1. **理解IO模型演进** - 需掌握$BIO$(阻塞IO)在连接数多时产生大量线程的问题[^1] - 理解$NIO$(非阻塞IO)的三大核心:通道(Channel)、缓冲区(Buffer)、选择器(Selector)[^4] - 对比$AIO$(异步IO)在Linux系统下支持不足的特点 2. **Reactor模式精要** - 单Reactor单线程模型适用于低并发场景 - 主从Reactor多线程模型通过$$线程池=主线程(事件分发) + 子线程(业务处理)$$结构实现高吞吐[^5] #### 二、Netty核心组件解析 1. **核心架构要素** - **Bootstrap**:客户端入口类,通过`group()`配置线程池[^3] - **NioSocketChannel**:客户端通道类型,需设置`SO_KEEPALIVE`等参数 - **ChannelPipeline**:通过`addLast()`添加编解码器、业务处理器 2. **关键注解应用** `@ChannelHandler.Sharable`注解实现处理器单例复用,需注意线程安全问题 #### 三、实践资源推荐 1. **学习仓库推荐** - [Github-netty-learn](https://github.com/example/netty-learn)(含NIO基础到集群聊天案例)[^2] - [Gitee-netty-learn](https://gitee.com/example/netty-learn)(国内镜像仓库)[^2] 2. **代码实践路线** ```java // 典型客户端初始化代码 EventLoopGroup group = new NioEventLoopGroup(); Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group) .channel(NioSocketChannel.class) .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) { ch.pipeline().addLast(new StringDecoder()); ch.pipeline().addLast(new SimpleClientHandler()); } }); ``` 此代码演示了线程池配置、通道类型指定、处理器链构建 #### 四、进阶学习方向 1. **性能优化专题** - 对象池技术减少GC压力 - 零拷贝技术应用(FileRegion类使用) 2. **源码研读重点** - EventLoop事件循环机制 - ByteBuf内存管理设计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值