【多檔案自平衡雲傳輸】使用展示 —— 檔案傳輸系統
阿新 • • 發佈:2020-08-22
![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
* 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、準備 資源 * 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、讀取配置檔案,初始化 SourceHolderNode 和 FilesReceiver * 2、請求 資源列表 * 3、請求 指定的資源 */ public class TestFilesReceive1 { public static void main(String[] args) { FilesReceiver filesReceiver = new FilesReceiver(); filesReceiver.initConfig("/resource/receive1.properties"); 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