大文件的分塊傳輸和斷點續傳設計實現的處理器

介紹

針對大文件的分塊傳輸和斷點續傳設計實現的處理器(支持上傳和下載),同時具備上傳/下載進度和上傳/下載速度的推送功能。 本項目的前端項目和客戶端項目並不是單獨部署到一臺服務器的,是在本機啟動,因為使用前端頁面與服務端實現大文件傳輸協議對於我來說有點困難... 而且對編寫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即可


分享到:


相關文章: