大文件的分块传输和断点续传设计实现的处理器

介绍

针对大文件的分块传输和断点续传设计实现的处理器(支持上传和下载),同时具备上传/下载进度和上传/下载速度的推送功能。 本项目的前端项目和客户端项目并不是单独部署到一台服务器的,是在本机启动,因为使用前端页面与服务端实现大文件传输协议对于我来说有点困难... 而且对编写java桌面客户端没有实战过。所以前端项目和客户端项目在本机启动,读取本机系统的文件,并提供页面操作

github:https://gitee.com/gaojunjie03/fileex

软件架构

  1. frontend-service 简单实现的前端页面(依赖netty-client)
  2. netty-client netty客户端 (依赖netty-common)
  3. netty-common netty客户端服务端公共项目
  4. netty-server netty服务端 (依赖netty-common)
  5. mongodb 提供数据服务(上传任务、下载任务、已上传完的文件数据)

技术实现

  1. 分块传输使用HTTP1.1协议的transfer-encoding:chunked,netty客户端和服务端上添加
<code>pipeline.addLast("chunkedWriter", new ChunkedWriteHandler());/<code>
  1. 断点续传主要使用了RandomAccessFile类来实现,不过该类是大量磁盘IO操作,所以效率不太高。 客户端首次上传文件时,不会使用RandomAccessFile进行分割,若此时停止上传再继续上传,客户端会首先请求服务端获取当前文件上传多少长度,客
    户端得到该长度会使用RandomAccessFile进行分割文件得到新的文件再次调用上传接口进行上传。 下载同样道理,只是是由客户端得到当前文件已下载的长度推给服务端,服务端拿到长度进行RandomAccessFile分割文件在推给客户端.
  2. netty-server 由于没有springboot的mvc功能,在编写接口上有一定的麻烦程度,所以这里简单手写实现了mvc的功能
  3. 由于直接默认使用netty的文件上传,是可以支持分块传输,但是不支持断点续传。所以这里改写了一下netty在接收文件写入文件时的部分代码 详细见netty-server/src/main/java/com/netty/my/MyAbstractDiskHttpData.java,netty-server/src/main/java/com/netty/my/MyDefaultHttpDataFactory.java,netty-server/src/main/java/com/netty/my/MyDiskFileUpload.java

安装教程

  1. 前端客户端连接服务端的配置类在netty-client/src/main/java/com/netty/Constants.java中 SERVER_IP 为netty-server所在服务器ip,WEBSOCKET_PORT为netty-server的websocket端口
  2. 本机启动前端客户端frontend-service,一个springboot服务
  3. 服务器安装mongodb
  4. netty-server的配置类在netty-client/src/main/java/com/netty/Constants.java 注意WEBSOCKET_IP只能填写0.0.0.0
  5. 服务器部署netty-server服务 启动命令java -jar xxxx.jar即可


分享到:


相關文章: