Netty 5 传送大文件的方法
Netty 5 提供了 一个ChunkedWriterHandler 来传送大文件,发送端如下:
添加chunedwriterhandler:
ChannelPipelinep = ...;
p.addLast("streamer", newChunkedWriteHandler());
p.addLast("handler", new MyHandler()); 直接发送文件
Channelch = ...;
ch.write(newChunkedFile(new File("video.mkv")); 需要注意的是 ChunkedWriterHandler 必须添加在 发送文件的handler的前面。 也就是先添加了handler,才能调用channel write chunedfile。 接收端的代码如下,关键点是发送端需要提前告知文件大小(File.length),将一个handler添加到所有的handler前面,这样拦截到文件内容,写完文件将handler移除。 ctx.pipeline().addFirst(new ChunkedReadHandler(size));
class ChunkedReadHandler extends ChannelHandlerAdapter{
private long fileSize;
private File file;
private FileOutputStream ofs;
private long readedSize=0;
public ChunkedReadHandler(long size) throws FileNotFoundException{
this.fileSize=size;
this.file = new File("C:/2.zip");
ofs=new FileOutputStream(this.file);
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf buf= (ByteBuf) msg;
readedSize +=buf.readableBytes();
if(buf.isReadable()){
byte[] bytes=new byte[buf.readableBytes()];
buf.readBytes(bytes);
ofs.write(bytes);
}
System.out.println(fileSize + " " + readedSize);
if(readedSize >= fileSize){
ctx.pipeline().remove(this);
ofs.close();
}
buf.release();
}
}
netty5文档里channelpipeline的doc给了一幅图比较清楚的描述了handler的关系,像tcp/ip协议一样是层次关系

一般的handler添加顺序为:
- Protocol Decoder - translates binary data (e.g.
ByteBuf) into a Java object. - Protocol Encoder - translates a Java object into binary data.
- Business Logic Handler - performs the actual business logic (e.g. database access).
对应的输入输出层先添加,再添加下一层的handler。
因此,我们的逻辑层就工作在最高层,抽象度最高也最方便。
Netty 5 传送大文件的方法的更多相关文章
- Linux培训教程 linux系统下分割大文件的方法
在linux中分割大文件,比如一个5gb日志文件,需要把它分成多个小文件,分割后以利于普通的文本编辑器读取. 有时,需要传输20gb的大文件,Linux培训 教程件到另一台服务器,也需要把它分割成多个 ...
- php中读取大文件实现方法详解
php中读取大文件实现方法详解 来源: 时间:2013-09-05 19:27:01 阅读数:6186 分享到:0 [导读] 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解 ...
- netty接收大文件的方法
参考:http://blog.csdn.net/linuu/article/details/51371595 https://www.jianshu.com/p/a0a51fd79f62 netty默 ...
- python tcp黏包和struct模块解决方法,大文件传输方法及MD5校验
一.TCP协议 粘包现象 和解决方案 黏包现象让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)执行远程命令的模块 需要用到模块subprocess sub ...
- 转(Response.WriteFile 无法下载大文件解决方法)
以前用Response.WriteFile(filename),但当遇到大文件时无法完整下载. 该方法最大的问题,它不是直接将数据抛到客户端,而是在服务器端(IIS)上缓存.当下载文件比较大时,服务器 ...
- 大文件读取方法(C#)
之前都是用StreamReader.ReadLine方法逐行读取文件,自从.NET4有了File.ReadLines这一利器,就再也不用为大文件发愁了. File.ReadLines在整个文件读取到内 ...
- python读取大文件的方法及mmap内存映射模块
python计算文件的行数和读取某一行内容的实现方法 :最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的 ...
- 把大象装进冰箱:HTTP传输大文件的方法
上次我们谈到了HTTP报文里的div,知道了HTTP可以传输很多种类的数据,不仅是文本,也能传输图片,音频和视频. 早期互联网上传输的基本上都是只有几k大小的文本和小图片,现在的情况则大有不同.网 ...
- Git 删除大文件的方法
git 仓库中删除历史大文件 git 仓库中删除历史大文件 在git中增加了一个很大的文件,而且被保存在历史提交记录中,每次拉取代码都很大,速度很慢.而且用删除 提交历史记录的方式不是很实际. 以 ...
随机推荐
- .NET调用osql.exe执行sql脚本创建表和存储过程
using System;using System.Diagnostics;using System.Windows.Forms; namespace WindowsFormsApplication1 ...
- HDU 献给杭电五十周年校庆的礼物 1290 递推
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1290 题目大意: n刀最多可以把一块蛋糕切多少块 题目分析: 假如我们按照立体考虑的话,这题就非常不 ...
- 实现字符串匹配的KMP算法
KMP算法是Knuth-Morris-Pratt算法的简称,它主要用于解决在一个长字符串S中匹配一个较短字符串s. 首先我们从整体来把我这个算法的思想. 字符串匹配的朴素算法: 我们容易想到朴素算法, ...
- 尚学堂 JAVA DAY11 概念总结
1.冒泡排序算法 <升序排列> 思路1: 数组长度为n,那么要对数组进行n-1次遍历; step 1---从数组的第一个数开始,两两比较,如果第一个数 > 第二个数,将二者进行交换: ...
- I - Strategic Game - hdu 1054(最小点覆盖)
题意:用最小的点来覆盖全部的边,因为二分图里面最大的匹配就是最小覆盖,所以直接匹配一下即可 ****************************************************** ...
- UVA11995【I can guess the data structrue!!】【水】+UVA11991【map用法】
先看UVA11995 两份代码一份直接用C写的,一份用STL写的 #include <iostream> #include <stdio.h> #include <str ...
- 297 - Quadtrees (UVa)
Quadtrees A quadtree is a representation format used to encode images. The fundamental idea behind t ...
- How to Create Custom Filters in AngularJs
http://www.codeproject.com/Tips/829025/How-to-Create-Custom-Filters-in-AngularJs Introduction Filter ...
- Oracle Quality --- Setup Collection Element and Collection Plan
Responsibility: Quality, Vision Enterprises 第一步: 创建 Collection Elements setup > collection elemen ...
- Android实现计时与倒计时(限时抢购)的几种方法
在购物网站的促销活动中一般都有倒计时限制购物时间或者折扣的时间,这些都是如何实现的呢? 在一个安卓客户端项目中恰好遇到了类似的问题,一开始使用的是Timer与 TimerTask, 虽然此方法通用,但 ...