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。

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。