Netty 5 传送大文件的方法
Netty 5 提供了 一个ChunkedWriterHandler 来传送大文件,发送端如下:
添加chunedwriterhandler:
ChannelPipeline
p = ...; p.addLast("streamer", newChunkedWriteHandler
()); p.addLast("handler", new MyHandler());
直接发送文件
Channel
ch = ...; ch.write(newChunkedFile
(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添加顺序为:
- 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。
因此,我们的逻辑层就工作在最高层,抽象度最高也最方便。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。