我是靠谱客的博主 寂寞抽屉,最近开发中收集的这篇文章主要介绍Netty 5 传送大文件的方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Netty 5 提供了 一个ChunkedWriterHandler 来传送大文件,发送端如下:

添加chunedwriterhandler:

 ChannelPipeline p = ...;
p.addLast("streamer", new ChunkedWriteHandler());
p.addLast("handler", new MyHandler());

直接发送文件
 Channel ch = ...;
ch.write(new ChunkedFile(new File("video.mkv"));

需要注意的是 ChunkedWriterHandler 必须添加在 发送文件的handler的前面。 也就是先添加了handler,才能调用channel write chunedfile。

接收端的代码如下,关键点是发送端需要提前告知文件大小(File.length),将一个handler添加到所有的handler前面,这样拦截到文件内容,写完文件将handler移除。

ctx.pipeline().addFirst(new ChunkedReadHandler(size));

 1 class ChunkedReadHandler extends ChannelHandlerAdapter{
 2
private long fileSize;
 3
private File file;
 4
private FileOutputStream ofs;
 5
private long readedSize=0;
 6
public ChunkedReadHandler(long size) throws FileNotFoundException{
 7
this.fileSize=size;
 8
this.file = new File("C:/2.zip");
 9
ofs=new FileOutputStream(this.file);
10 
}
11 
@Override
12
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
13
14
ByteBuf buf= (ByteBuf) msg;
15
16
readedSize +=buf.readableBytes();
17
if(buf.isReadable()){
18
byte[] bytes=new byte[buf.readableBytes()];
19 
buf.readBytes(bytes);
20 
ofs.write(bytes);
21 
}
22
23
System.out.println(fileSize + "
" + readedSize);
24
25
if(readedSize >= fileSize){
26
ctx.pipeline().remove(this);
27 
ofs.close();
28 
}
29 
buf.release();
30 
}
31 }

 

netty5文档里channelpipeline的doc给了一幅图比较清楚的描述了handler的关系,像tcp/ip协议一样是层次关系

 

一般的handler添加顺序为:

  1. Protocol Decoder - translates binary data (e.g. ByteBuf) into a Java object.
  2. Protocol Encoder - translates a Java object into binary data.
  3. Business Logic Handler - performs the actual business logic (e.g. database access).

对应的输入输出层先添加,再添加下一层的handler。

因此,我们的逻辑层就工作在最高层,抽象度最高也最方便。

转载于:https://www.cnblogs.com/learningspace/p/4314319.html

最后

以上就是寂寞抽屉为你收集整理的Netty 5 传送大文件的方法的全部内容,希望文章能够帮你解决Netty 5 传送大文件的方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(28)

评论列表共有 0 条评论

立即
投稿
返回
顶部