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协议一样是层次关系

 

Netty 5 传送大文件的方法

一般的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。

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

你可能感兴趣的:(netty)