Netty实战应用学习笔记-中级拓展篇(十一)

「深入浅出Netty」不愧是阿里架构师,这篇Netty实战文档太实用 前言 什么是Netty? Netty是由JBOSS提供的一个java开源框架。 Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty是一个基于NIO的客户,服务器端编程框架,使用Netty可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。 作为当前最流行的NIO框架,Netty在互联... 阅读详情

📦 项目十一:ChunkedStream数据流切块传输

项目概述

项目名称:itstack-demo-netty-2-11
核心功能:基于ChunkedStream实现数据流切块传输
技术要点:ChunkedWriteHandler、ChunkedStream、流量控制

为什么需要这个项目?

实际问题:

  • 大数据量传输容易导致内存溢出
  • 写操作非阻塞,数据可能堆积在内存中
  • 网络传输饱和时,数据处理拥堵
  • GC频繁,影响系统性能

解决方案:

  • ✅ ChunkedStream:自动从InputStream分块读取
  • ✅ ChunkedWriteHandler:Netty提供的分块写入处理器
  • ✅ 流量控制:避免数据堆积,保护内存
  • ✅ 进度监控:实时监控传输进度

适用场景:

  • 文件传输(大文件分块上传/下载)
  • 视频流传输(视频数据分块发送)
  • 大数据量推送(避免内存溢出)
  • 实时数据流(日志流、监控数据流)

核心问题

为什么需要切块传输?

在Netty异步NIO框架下,高效、频繁、大量写入大块数据时:

  • 网络传输饱和 → 数据处理拥堵
  • GC频繁 → 内存压力大
  • 用户掉线 → 连接不稳定
  • 内存耗尽风险 → 写操作非阻塞,即使数据没写完也会返回

核心原因:写操作是非阻塞的,即使没有写出所有数据,写操作也会在完成时返回并通知ChannelFuture。

核心知识点

1. Netty提供的ChunkedInput实现
实现类用途
ChunkedFile从文件中逐块获取数据
ChunkedNioFile使用FileChannel逐块获取
ChunkedStream从InputStream中逐块传输 ⭐
ChunkedNioStream从ReadableByteChannel中逐块传输
2. Pipeline配置
protected void initChannel(SocketChannel channel) {
    // 1. 基于换行符的帧解码器
    channel.pipeline().addLast(new LineBasedFrameDecoder(1024));
    
    // 2. 流量分块处理器 ⭐关键
    channel.pipeline().addLast(new ChunkedWriteHandler());
    
    // 3. 自定义分块处理器
    channel.pipeline().addLast(new MyServerChunkHandler());
    
    // 4. 字符串解码/编码
    channel.pipeline().addLast(new StringDecoder(Charset.forName("GBK")));
    channel.pipeline().addLast(new StringEncoder(Charset.forName("GBK")));
    
    // 5. 业务处理器
    channel.pipeline().addLast(new MyServerHandler());
}
3. 核心分块逻辑

MyServerChunkHandler.java

public class MyServerChunkHandler extends ChannelOutboundHandlerAdapter {
    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
        // 1. 获取ByteBuf数据
        ByteBuf buf = (ByteBuf) msg;
        byte[] data = this.getData(buf);
        
        // 2. 将数据写入输入流
        ByteInputStream in = new ByteInputStream();
        in.setBuf(data);
        
        // 3. 创建分块流 - 每次传输10个字节 ⭐核心
        ChunkedStream stream = new ChunkedStream(in, 10);
        
        // 4. 创建进度监听器
        ChannelProgressivePromise progressivePromise = 
            ctx.channel().newProgressivePromise();
        progressivePromise.addListener(new ChannelProgressiveFutureListener() {
            @Override
            public void operationProgressed(ChannelProgressiveFuture future, 
                                           long progress, long total) {
                // 监控传输进度
            }
            
            @Override
            public void operationComplete(ChannelProgressiveFuture future) {
                if (future.isSuccess()) {
                    System.out.println("消息发送成功");
                    promise.setSuccess();
                } else {
                    System.out.println("消息发送失败");
                    promise.setFailure(future.cause());
                }
            }
        });
        
        // 5. 释放原始消息
        ReferenceCountUtil.release(msg);
        
        // 6. 写入分块流
        ctx.write(stream, progressivePromise);
    }
}
4. ChunkedStream工作原理
ChunkedStream stream = new ChunkedStream(in, 10);
  • 参数1:InputStream - 数据源
  • 参数2:10 - 每次读取的字节数(分块大小)

工作流程:

1. 系统以固定速率向令牌桶中添加令牌
   例如:10字节/秒 = 每100ms添加1字节令牌
   
2. 当需要发送数据时:
   - 检查令牌桶中是否有足够的令牌
   - 有令牌:消耗令牌,发送数据
   - 无令牌:将数据放入队列,等待令牌
   
3. 流量整形效果:
   - 即使应用层快速写入大量数据
   - 实际发送速率被限制在设定值
   - 超出部分被缓存,不会丢失

数据流程

客户端发送30字节数据
   ↓
ChunkedWriteHandler拦截
   ↓
创建ChunkedStream(in, 10)  // 每次10字节
   ↓
第1秒:发送10字节,剩余20字节进入队列
   ↓
第2秒:发送10字节,剩余10字节进入队列
   ↓
第3秒:发送10字节,全部发送完成
   ↓
触发operationComplete回调

项目总结

核心技术:

  • ✅ ChunkedStream:自动从InputStream分块读取
  • ✅ ChunkedWriteHandler:Netty提供的分块写入处理器
  • ✅ ChannelProgressivePromise:监控传输进度
  • ✅ 分块大小可调整:示例10字节,实际可设置更大

适用场景:

  • 文件传输(大文件分块上传/下载)
  • 视频流传输(视频数据分块发送)
  • 大数据量推送(避免内存溢出)
  • 实时数据流(日志流、监控数据流)

关键要点:

  • 分块传输有效避免内存问题
  • 可以监控传输进度
  • 适用于大数据传输场景

bugstack虫洞栈 | netty4.1案例文章列表汇总,跟着案例学Netty itstack-demo-netty netty4.x案例 微信公众号:bugstack虫洞栈,欢迎您的关注&获取更多案例与源码!博客栈:https://bugstack.cn 本专题针对netty4.x分为从;基础入门篇(九篇)、中级拓展篇(八篇)、高级应用篇(三章),由浅入深实现netty服务功能,介绍netty如何从上手到实战。 基础入门篇(九篇) netty案例,netty4.1... 阅读详情

相关推荐

netty案例,netty4.1中级拓展篇十一《Netty基于ChunkedStream数据流切块传输》

前言介绍 在Netty这种异步NIO框架的结构下,服务端与客户端通信过程中,高效、频繁、大量的写入大块数据时,因网络传输饱和的可能性就会造成数据处理拥堵、GC频繁、用户掉线的可能性。那么由于写操作是非阻塞的,所以即使没有写出所有的数据,写操作也会在完成时返回并通知ChannelFuture。当这种情况发生时,如果仍然不停地写入,就有内存耗尽的风险。所以在写大块数据时,需要对大块数据进行切割发送处理...

bugstack虫洞栈 3340

Netty实战应用学习笔记-中级拓展篇(一)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 1072

netty案例,netty4.1中级拓展篇一《Netty与SpringBoot整合》

前言介绍 在实际的开发中,我们需要对netty服务进行更多的操作,包括;获取它的状态信息、启动/停止、对客户端用户强制下线等等,为此我们需要把netty服务加入到web系统中,那么本章节介绍如何将Netty与SpringBoot整合。 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使...

bugstack虫洞栈 2642

Netty实战应用学习笔记-中级拓展篇(六)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 630

netty案例,netty4.1中级拓展篇五《基于Netty搭建WebSocket,模仿微信聊天页面》

前言介绍 本章节我们模仿微信聊天页面,开发一个基于Netty搭建WebSocket通信案例。Netty的应用方面非常广;聊天、MQ、RPC、数据等等,在5G到来的时候更加需要大量数据传输,Netty的应用也会更加广阔。 1、这个案例使用SpringBoot+Netty+WebSocket搭建功能。 2、使用Netty提供的HttpServerCodec、HttpObjectAggregator、...

bugstack虫洞栈 3072

netty案例,netty4.1中级拓展篇七《Netty请求响应同步通信》

前言介绍 在我们实现开发RPC框架的时候,需要选择socket的通信方式。而我们知道一般情况下socket通信类似与qq聊天,发过去消息,什么时候回复都可以。但是我们RPC框架通信,从感觉上类似http调用,需要在一定时间内返回,否则就会发生超时断开。这里我们选择netty作为我们的socket框架,采用future方式进行通信。 Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于...

bugstack虫洞栈 2265

Netty实战应用学习笔记-中级拓展篇(十二)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 1087

netty案例,netty4.1中级拓展篇三《Netty传输Java对象》

前言介绍 Netty在实际应用级开发中,有时候某些特定场景下会需要使用Java对象类型进行传输,但是如果使用Java本身序列化进行传输,那么对性能的损耗比较大。为此我们需要借助protostuff-core的工具包将对象以二进制形式传输并做编码解码处理。与直接使用protobuf二进制传输方式不同,这里不需要定义proto文件,而是需要实现对象类型编码解码器,用以传输自定义Java对象。 pro...

bugstack虫洞栈 2142

Netty实战应用学习笔记-中级拓展篇(九)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 1063

netty案例,netty4.1中级拓展篇十二《Netty流量整形数据流速率控制分析与实战》

作者:付政委 | 关注微信公众号:bugstack虫洞栈,获取专题案例源码 前言介绍 你是否使用过某盘,在前几年我们使用的时候速度飞快,上传下载嗖嗖嗖。但是近年来只要不办会员,速度慢的像蜗牛,当然人家也得赚钱我们能理解。那么这样的限速是怎么实现的呢,我们这个案例使用Netty的流量整形进行限速传输,测试过程中当你把流量整形功能去掉后你就是年费VIP。 流量整形(Traffic Shaping...

bugstack虫洞栈 3696

netty案例,netty4.1中级拓展篇四《Netty传输文件、分片发送、断点续传》

前言介绍 1、在实际应用中我们经常使用到网盘服务,他们可以高效的上传下载较大文件。那么这些高性能文件传输服务,都需要实现的分片发送、断点续传功能。 2、在Java文件操作中有RandomAccessFile类,他可以支持文件的定位读取和写入,这样就满足了我们对文件分片的最基础需求。 3、Netty服务端启动后,可以向客户端发送文件传输指令;允许接收文件、控制读取位点、记录传输标记、文件接收完成。 ...

bugstack虫洞栈 3229

Netty实战应用学习笔记-中级拓展篇(十三)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 570

netty案例,netty4.1中级拓展篇二《Netty使用Protobuf传输数据》

前言介绍 在netty数据传输过程中可以有很多选择,比如;字符串、json、xml、java对象,但为了保证传输的数据具备;良好的通用性、方便的操作性和传输的高性能,我们可以选择protobuf作为我们的数据传输格式。目前protobuf可以支持;C++、C#、Dart、Go、Java、Python等,也可以在JS里使用。知识点;ProtobufDecoder、ProtobufEncoder、Pr...

bugstack虫洞栈 2080

Netty实战应用学习笔记-中级拓展篇(八)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 640

netty案例,netty4.1中级拓展篇八《Netty心跳服务与断线重连》

前言介绍 在我们使用netty中,需要监测服务是否稳定以及在网络异常链接断开时候可以自动重连。需要实现监听;f.addListener(new MyChannelFutureListener()) 环境准备 1、jdk1.8【jdk1.7以下只能部分支持netty】 2、Netty4.1.36.Final【netty3.x 4.x 5每次的变化较大,接口类名也随着变化】 代码示例 itstack-...

bugstack虫洞栈 2069

华为EC6110系列(3798mv310芯片)强刷固件全解析:从准备到实战

本文详细解析了华为EC6110系列(3798mv310芯片)强刷固件的全过程,从准备工作到实战步骤,包括固件特点、刷机工具准备、详细刷机步骤及常见问题解决方案。适合想要提升盒子性能的用户参考,特别强调了刷机过程中的注意事项和实用技巧。

rock5的博客 733

Netty实战应用学习笔记-中级拓展篇(五)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 636

SpringBoot+Vue实现图片上传

SpringBoot+Vue实现图片上传

叶♥璃 2731

Netty实战应用学习笔记-中级拓展篇(七)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 322

10分钟上手YOLOv11:最强姿态估计模型来了,代码开源,效果炸裂!

【10分钟玩转YOLOv11实时姿态估计】🚀 YOLOv11作为YOLO家族最新成员,在速度、精度和易用性上全面升级,尤其适用于姿态估计等复杂视觉任务。本文带您快速掌握: 1️⃣ 核心概念:姿态估计即识别人体17个关键点(如关节部位)并连接成数字骨架,是智能健身、体感游戏等应用的基础。 2️⃣ 技术优势: 超轻量级(最小仅2.9M参数) 极速推理(GPU仅1.7ms) 高精度(COCO mAP@50-95达50%) 3️⃣ 三步实操: ① 安装:pip install ultralytics ② 准备人物

weixin_41246802的博客 1789

大漠插件找图找字避坑手册:从ziku0.txt字库制作到易语言精准识别(附综合工具实操)

本文深入解析大漠插件在图像识别中的核心难点,提供从ziku0.txt字库精准制作到易语言高效调用的完整避坑指南。重点讲解如何利用大漠综合工具科学设置偏色与二值化参数,生成高质量色彩描述字符串,并分享识别失败的系统排查方法与进阶优化策略,旨在实现99%的稳定识别率。

weixin_29264201的博客 1208

Netty实战应用学习笔记-中级拓展篇(三)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 306

手把手教你用Foobar2000播放DSD音频(含DOP设置与SPDIF输出教程)

本文详细指导如何在Foobar2000中播放DSD音频,重点解析了DOP协议的原理与设置方法。通过安装SACD插件、配置输出设备及启用DOP模式,实现DSD音频的原生比特流输出,并特别讲解了如何通过SPDIF接口传输DSD信号,帮助发烧友充分释放高清音频设备的潜力。

weixin_29290963的博客 1829
上一篇: Netty实战应用学习笔记-中级拓展篇(十)
下一篇: Netty实战应用学习笔记-中级拓展篇(十二)
不早睡不改名@
博客等级 码龄5年 536粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值