1. 程式人生 > >【多檔案自平衡雲傳輸】使用展示 —— 檔案傳輸系統

【多檔案自平衡雲傳輸】使用展示 —— 檔案傳輸系統

![Youzg LOGO](https://files-cdn.cnblogs.com/files/codderYouzg/YouzgLogo.bmp) 本篇博文,作為 **`多檔案自平衡雲傳輸 框架`** 的 **使用案例** 將會全面應用 **`多檔案自平衡雲傳輸 框架`**,來實現一個 **檔案傳輸系統** 那麼,話不多說,現在就開始講解吧: 首先,本人來 說明下 需要的 **Jar包支援**: # Jar包 支援: >- Youzg-Mec-Utils-0.0.1.jar >(可在本人博文[《【小工具】專欄總集篇》](https://www.cnblogs.com/codderYouzg/p/13530087.html)文末獲取) >- rmi-0.0.1.jar >(可在本人博文[《詳解 RMI技術 的基本實現》](https://www.cnblogs.com/codderYouzg/p/12784691.html)文末獲取) >- net-file-trans-0.0.1.jar >(可在本人博文[《詳解 網路檔案傳輸技術 的基本實現》](https://www.cnblogs.com/codderYouzg/p/13537304.html)文末獲取) >- balance-0.0.1.jar >(可在本人博文[《詳解 負載均衡技術 的基本實現》](https://www.cnblogs.com/codderYouzg/p/13539545.html)文末獲取) >- resource-discovery-0.0.1.jar >(可在本人博文[《詳解 資源發現技術 的基本實現》](https://www.cnblogs.com/codderYouzg/p/13542855.html)文末獲取) >- mfsbct-0.0.1.jar >(可在本人博文[《【多檔案自平衡雲傳輸】專欄總集篇》](https://www.cnblogs.com/codderYouzg/p/13542855.html)文末獲取) >- log4j-1.2.17.jar >- cglib-nodep-2.1.3.jar >- gson-2.7.jar >- fastjson-1.2.62.jar --- 在之前的博文中,本人就講過: > 主要是實現 **三端**: >1. **`註冊中心`** >2. **`檔案傳送端`** >3. **`檔案接收端`** 那麼,本人就先來實現下 **`註冊中心`**: # 註冊中心: ## 實現 邏輯: 直接使用 **`多檔案自平衡雲傳輸 框架`**, 實現 註冊中心 的 **初始化**、**啟動**、**訊息處理**、**關閉** 等功能 即可 ## 實現 程式碼: ```java package edu.youzg.test; import edu.youzg.resource_founder.core.IResourceListener; import edu.youzg.resource_founder.core.ResourceRegistryCenter; import org.apache.log4j.Logger; public class ResourceCenterServer implements IResourceListener { private static final String DEFAULT_CONFIG_PATH = "/resource/ResourceRegistryCenter-RMI.xml"; public static final int RCSPort = 6666; private ResourceRegistryCenter center; private Logger log = Logger.getLogger(ResourceCenterServer.class); public ResourceCenterServer() { this.center = new ResourceRegistryCenter(RCSPort); this.center.addListener(this); } public void initCenter() { initCenter(DEFAULT_CONFIG_PATH); } public void initCenter(String configFilePath) { this.center.initRegistryCenter(configFilePath); } public void startup() { this.center.startup(); } public void shutdown() { this.center.shutdown(); } @Override public void dealMessage(String message) { log.info(message); } } ``` --- # 檔案傳送端: ## 實現 邏輯: 直接使用 **`多檔案自平衡雲傳輸 框架`**, 實現 檔案傳送端 的 **初始化**、**註冊 檔案資源**、**登出 檔案資源** 等功能 即可 ## 實現 程式碼: ```java package edu.youzg.test; import edu.youzg.multifile_cloud_transfer.exception.RegistryIpIsNullException; import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList; import edu.youzg.multifile_cloud_transfer.sender.SourceHolderNode; import edu.youzg.resource_founder.core.ResourceBaseInfo; /** * 檔案傳送端 */ public class FilesSender { private SourceHolderNode holderNode; public FilesSender() throws RegistryIpIsNullException { this.holderNode = SourceHolderNode.newInstance(); } public static void initConfig(String configFile) { SourceHolderNode.initConfig(configFile); } public void registryResource(ResourceBaseInfo baseInfo, SourceFileList fileList) { this.holderNode.reportResource(baseInfo, fileList); } public void logoutResource(ResourceBaseInfo baseInfo) { this.holderNode.logoutResource(baseInfo); } } ``` --- # 檔案接收端: ## 實現 邏輯: 直接使用 **`多檔案自平衡雲傳輸 框架`**, 實現 檔案接收端 的 **初始化**、**獲取 資源基本資訊列表**、**獲取 指定資源詳細資訊列表**、**請求資源** 等功能 即可 ## 實現 程式碼: ```java package edu.youzg.test; import edu.youzg.multifile_cloud_transfer.exception.ResourceNotExistException; import edu.youzg.multifile_cloud_transfer.receive.ResourceReceiver; import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList; import edu.youzg.multifile_cloud_transfer.sender.SourceHolderNode; import edu.youzg.resource_founder.core.ResourceBaseInfo; import edu.youzg.resource_founder.core.ResourceSpecificInfo; import edu.youzg.util.PropertiesParser; import java.util.List; /** * 檔案接收端 */ public class FilesReceiver { private ResourceReceiver videoReceiver; public FilesReceiver() { this.videoReceiver = new ResourceReceiver(); } /** * 根據 指定路徑,初始化 接收端資訊 * @param configFile 配置檔案 所在路徑 */ public void initConfig(String configFile) { SourceHolderNode.initConfig(configFile); PropertiesParser.loadProperties(configFile); int port = Integer.valueOf(PropertiesParser.value("port")); String registryIp = PropertiesParser.value("registry_ip"); int registryPort = Integer.valueOf(PropertiesParser.value("registry_port")); this.videoReceiver.setCenterIp(registryIp); this.videoReceiver.setCenterPort(registryPort); this.videoReceiver.setReceiveServerPort(port); } public void setBaseInfo(ResourceBaseInfo ri) { this.videoReceiver.setBaseInfo(ri); } public void setSourceFileList(SourceFileList fileList) { this.videoReceiver.setFileList(fileList); } /** * 獲取 註冊中心 的資源基本資訊列表 * @return 註冊中心 的資源基本資訊列表 */ public List getResourceList() { return this.videoReceiver.getResourceList(); } /** * 根據 資源基本資訊,獲取資源詳細資訊列表 * @param ri 資源基本資訊 * @return 資源詳細資訊列表 */ public List getFileInfoListByResourceInfo(ResourceBaseInfo ri) { return this.videoReceiver.getFileInfoListByResourceInfo(ri); } /** * 請求資源 */ public void requestFiles() { try { this.videoReceiver.getResourceFiles(); } catch (ResourceNotExistException e) { e.printStackTrace(); } } } ``` --- 那麼,到這裡,三端就實現完畢了! 下面,我們來測試下 是否能達到我們期望的目標: # 測試: 首先是 **註冊中心端** ## 檔案資源 註冊中心: ```java package edu.youzg.test; /** * 註冊中心 步驟:
* 1、初始化 ResourceCenterServer
* 2、啟動 註冊中心 */ public class TestResourceCenter { public static void main(String[] args) { ResourceCenterServer rcs = new ResourceCenterServer(); rcs.initCenter("/resource/ResourceRegistryCenter-RMI.xml"); rcs.startup(); } } ``` --- ## 註冊中心 RMI配置檔案 —— ResourceRegistryCenter-RMI.xml: ### 配置路徑: ```java resource/ResourceRegistryCenter-RMI.xml ``` ### 配置內容: ```java
``` --- 接下來 是 兩個傳送端: ## 檔案資源 傳送端1: ```java package edu.youzg.test; import edu.youzg.multifile_cloud_transfer.exception.RegistryIpIsNullException; import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList; import edu.youzg.resource_founder.core.ResourceBaseInfo; import edu.youzg.resource_founder.resourcer.ResourceHolder; /** * 傳送端 步驟:
* 1、準備 資源 * 2、準備 傳送端 * 3、註冊資源 */ public class TestFilesSender1 { public static void main(String[] args) throws RegistryIpIsNullException { FilesSender.initConfig("/resource/holder1.properties"); ResourceHolder.scanRMIMapping("/resource/ResourceHolder-RMI.xml"); ResourceBaseInfo ri = new ResourceBaseInfo("app", "20170526212853", "1"); SourceFileList sfl = new SourceFileList(); sfl.setAbsoluteRoot("E:\\Multi-file self-balancing cloud transfer\\testArea\\source\\"); sfl.collectFiles(); FilesSender sender = new FilesSender(); sender.registryResource(ri, sfl); } } ``` --- ## 傳送端1 連線引數配置檔案 —— holder1.properties: ### 配置路徑: ```java resource/holder1.properties ``` ### 配置內容: ```java port=54192 registry_ip=localhost registry_port=6666 ``` --- ## 檔案資源 傳送端2: ```java package edu.youzg.test; import edu.youzg.multifile_cloud_transfer.exception.RegistryIpIsNullException; import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList; import edu.youzg.resource_founder.core.ResourceBaseInfo; import edu.youzg.resource_founder.resourcer.ResourceHolder; /** * 傳送端 步驟:
* 1、準備 資源 * 2、準備 傳送端 * 3、註冊資源 */ public class TestFilesSender2 { public static void main(String[] args) throws RegistryIpIsNullException { FilesSender.initConfig("/resource/holder2.properties"); ResourceHolder.scanRMIMapping("/resource/ResourceHolder-RMI.xml"); ResourceBaseInfo ri = new ResourceBaseInfo("app", "20170526212853", "1"); SourceFileList sfl = new SourceFileList(); sfl.setAbsoluteRoot("E:\\Multi-file self-balancing cloud transfer\\testArea\\source"); sfl.collectFiles(); FilesSender sender = new FilesSender(); sender.registryResource(ri, sfl); } } ``` --- --- ## 傳送端2 連線引數配置檔案 —— holder2.properties: ### 配置路徑: ```java resource/holder2.properties ``` ### 配置內容: ```java port=54193 registry_ip=localhost registry_port=6666 ``` --- ## 傳送端 RMI配置檔案 —— ResourceHolder-RMI.xml: ### 配置路徑: ```java resource/ResourceHolder-RMI.xml ``` ### 配置內容: ```java ``` --- 最後是 兩個**接收端**: ## 檔案資源 接收端1: ```java package edu.youzg.test; import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList; import edu.youzg.resource_founder.core.ResourceBaseInfo; import edu.youzg.resource_founder.core.ResourceSpecificInfo; import java.util.List; /** * 接收端 步驟:
* 1、讀取配置檔案,初始化 SourceHolderNode 和 FilesReceiver * 2、請求 資源列表 * 3、請求 指定的資源 */ public class TestFilesReceive1 { public static void main(String[] args) { FilesReceiver filesReceiver = new FilesReceiver(); filesReceiver.initConfig("/resource/receive1.properties"); List resourceList = filesReceiver.getResourceList(); if (resourceList == null || resourceList.size() <= 0) { System.out.println("註冊中心 當前不存在 資源"); return; } ResourceBaseInfo resourceInfo = resourceList.get(0); SourceFileList sfl = new SourceFileList(); List fileInfoList = filesReceiver.getFileInfoListByResourceInfo(resourceInfo); sfl.setFileList(fileInfoList); sfl.setAbsoluteRoot("E:\\Multi-file self-balancing cloud transfer\\testArea\\target1\\"); filesReceiver.setBaseInfo(resourceInfo); filesReceiver.setSourceFileList(sfl); filesReceiver.requestFiles(); } } ``` --- ## 接收端1 連線引數配置檔案 —— receive1.properties: ### 配置路徑: ```java resource/receive1.properties ``` ### 配置內容: ```java port=54194 registry_ip=localhost registry_port=6666 ``` --- ## 檔案資源 接收端2: ```java package edu.youzg.test; import edu.youzg.multifile_cloud_transfer.resourcer.SourceFileList; import edu.youzg.resource_founder.core.ResourceBaseInfo; import edu.youzg.resource_founder.core.ResourceSpecificInfo; import java.util.List; /** * 接收端 步驟:
* 1、讀取配置檔案,初始化 SourceHolderNode 和 FilesReceiver * 2、請求 資源列表 * 3、請求 指定的資源 */ public class TestFilesReceive2 { public static void main(String[] args) { FilesReceiver filesReceiver = new FilesReceiver(); filesReceiver.initConfig("/resource/receive2.properties"); List resourceList = filesReceiver.getResourceList(); if (resourceList == null || resourceList.size() <= 0) { System.out.println("註冊中心 當前不存在 資源"); return; } ResourceBaseInfo resourceInfo = resourceList.get(0); SourceFileList sfl = new SourceFileList(); List fileInfoList = filesReceiver.getFileInfoListByResourceInfo(resourceInfo); sfl.setFileList(fileInfoList); sfl.setAbsoluteRoot("E:\\Multi-file self-balancing cloud transfer\\testArea\\target2\\"); filesReceiver.setBaseInfo(resourceInfo); filesReceiver.setSourceFileList(sfl); filesReceiver.requestFiles(); } } ``` --- ## 接收端2 連線引數配置檔案 —— receive2.properties: ### 配置路徑: ```java resource/receive2.properties ``` ### 配置內容: ```java port=54195 registry_ip=localhost registry_port=6666 ``` --- ## 接收端 RMI配置檔案 —— ResourceHolder-RMI.xml: ### 配置路徑: ```java resource/ResourceHolder-RMI.xml ``` ### 配置內容: ```java ``` 相信很多同學會疑惑: > 為什麼 接收端也要有 **和傳送端一樣的 RMI配置檔案** 呢? 這是因為: > 當 接收端 接收完畢 指定的檔案資源後,接收端也就成了 該資源的擁有者, > 會將自身註冊為 該資源的傳送端 --- ## 全域性 日誌配置檔案 —— log4j.properties: ### 配置路徑: ```java log4j.properties ``` ### 配置內容: ```java # 將等級為DEBUG的日誌資訊輸出到console和file這兩個目的地, # console和file的定義在下面的程式碼 log4j.rootLogger=DEBUG,console,file # 控制檯輸出的相關設定 log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Target=System.out log4j.appender.console.Threshold=DEBUG log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%c]-%m%n # 檔案輸出的相關設定 log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=./log/youzgLog.log log4j.appender.file.MaxFileSize=10mb # 限定寫入檔案的資訊級別 # log4j.appender.file.Threshold=DEBUG log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n # 日誌輸出級別 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG ``` --- 至此,使用案例 就基本完成了! 那麼,本人現在通過 一個**視訊** 來展示下 **執行結果**: ## 視訊 展示: [《大學僧 自制 Java“開源”框架 使用展示》](https://player.bilibili.com/player.html?aid=754367067) --- 若有需要上述程式碼的同學,本人已將本文所講解到的程式碼上傳: # 完整 程式碼: 如有需要,請點選下方連結: [Multi-file-self-balancing-cloud-transfer-System](https://github.com/codderYouzg/Multi-file-self-balancing-cloud-transfer