zoukankan      html  css  js  c++  java
  • 【多文件自平衡云传输】使用展示 —— 文件传输系统

    Youzg LOGO

    本篇博文,作为 多文件自平衡云传输 框架使用案例
    将会全面应用 多文件自平衡云传输 框架,来实现一个 文件传输系统

    那么,话不多说,现在就开始讲解吧:

    首先,本人来 说明下 需要的 Jar包支持

    Jar包 支持:


    在之前的博文中,本人就讲过:

    主要是实现 三端

    1. 注册中心
    2. 文件发送端
    3. 文件接收端

    那么,本人就先来实现下 注册中心

    注册中心:

    实现 逻辑:

    直接使用 多文件自平衡云传输 框架
    实现 注册中心 的 初始化启动消息处理关闭 等功能 即可

    实现 代码:

    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);
    	}
    	
    }
    

    文件发送端:

    实现 逻辑:

    直接使用 多文件自平衡云传输 框架
    实现 文件发送端 的 初始化注册 文件资源注销 文件资源 等功能 即可

    实现 代码:

    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);
    	}
    
    }
    

    文件接收端:

    实现 逻辑:

    直接使用 多文件自平衡云传输 框架
    实现 文件接收端 的 初始化获取 资源基本信息列表获取 指定资源详细信息列表请求资源 等功能 即可

    实现 代码:

    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<ResourceBaseInfo> getResourceList() {
    		return this.videoReceiver.getResourceList();
    	}
    
    	/**
    	 * 根据 资源基本信息,获取资源详细信息列表
    	 * @param ri 资源基本信息
    	 * @return 资源详细信息列表
    	 */
    	public List<ResourceSpecificInfo> getFileInfoListByResourceInfo(ResourceBaseInfo ri) {
    		return this.videoReceiver.getFileInfoListByResourceInfo(ri);
    	}
    
    	/**
    	 * 请求资源
    	 */
    	public void requestFiles() {
    		try {
    			this.videoReceiver.getResourceFiles();
    		} catch (ResourceNotExistException e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    

    那么,到这里,三端就实现完毕了!

    下面,我们来测试下 是否能达到我们期望的目标:

    测试:

    首先是 注册中心端

    文件资源 注册中心:

    package edu.youzg.test;
    
    /**
     * 注册中心 步骤:<br/>
     * 1、初始化 ResourceCenterServer<br/>
     * 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:

    配置路径:

    resource/ResourceRegistryCenter-RMI.xml
    

    配置内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <RmiMapping>
        <mapping interface="edu.youzg.resource_founder.center.IResourceCenter"
                 class="edu.youzg.resource_founder.center.ResourceCenterImpl"></mapping>
    </RmiMapping>
    

    接下来 是 两个发送端:

    文件资源 发送端1:

    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;
    
    /**
     * 发送端 步骤:<br/>
     * 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:

    配置路径:

    resource/holder1.properties
    

    配置内容:

    port=54192
    registry_ip=localhost
    registry_port=6666
    

    文件资源 发送端2:

    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;
    
    /**
     * 发送端 步骤:<br/>
     * 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:

    配置路径:

    resource/holder2.properties
    

    配置内容:

    port=54193
    registry_ip=localhost
    registry_port=6666
    

    发送端 RMI配置文件 —— ResourceHolder-RMI.xml:

    配置路径:

    resource/ResourceHolder-RMI.xml
    

    配置内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <RmiMapping>
        <mapping interface="edu.youzg.resource_founder.center.IResourceCenter"
                 class="edu.youzg.resource_founder.center.ResourceCenterImpl"></mapping>
    </RmiMapping>
    

    最后是 两个接收端

    文件资源 接收端1:

    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;
    
    /**
     * 接收端 步骤:<br/>
     * 1、读取配置文件,初始化 SourceHolderNode 和 FilesReceiver
     * 2、请求 资源列表
     * 3、请求 指定的资源
     */
    public class TestFilesReceive1 {
    
    	public static void main(String[] args) {
    		FilesReceiver filesReceiver = new FilesReceiver();
    		filesReceiver.initConfig("/resource/receive1.properties");
    		List<ResourceBaseInfo> resourceList = filesReceiver.getResourceList();
    		if (resourceList == null || resourceList.size() <= 0) {
    			System.out.println("注册中心 当前不存在 资源");
    			return;
    		}
    
    		ResourceBaseInfo resourceInfo = resourceList.get(0);
    
    		SourceFileList sfl = new SourceFileList();
    		List<ResourceSpecificInfo> 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:

    配置路径:

    resource/receive1.properties
    

    配置内容:

    port=54194
    registry_ip=localhost
    registry_port=6666
    

    文件资源 接收端2:

    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;
    
    /**
     * 接收端 步骤:<br/>
     * 1、读取配置文件,初始化 SourceHolderNode 和 FilesReceiver
     * 2、请求 资源列表
     * 3、请求 指定的资源
     */
    public class TestFilesReceive2 {
    
    	public static void main(String[] args) {
    		FilesReceiver filesReceiver = new FilesReceiver();
    		filesReceiver.initConfig("/resource/receive2.properties");
    		List<ResourceBaseInfo> resourceList = filesReceiver.getResourceList();
    		if (resourceList == null || resourceList.size() <= 0) {
    			System.out.println("注册中心 当前不存在 资源");
    			return;
    		}
    
    		ResourceBaseInfo resourceInfo = resourceList.get(0);
    		SourceFileList sfl = new SourceFileList();
    		List<ResourceSpecificInfo> 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:

    配置路径:

    resource/receive2.properties
    

    配置内容:

    port=54195
    registry_ip=localhost
    registry_port=6666
    

    接收端 RMI配置文件 —— ResourceHolder-RMI.xml:

    配置路径:

    resource/ResourceHolder-RMI.xml
    

    配置内容:

    <?xml version="1.0" encoding="UTF-8"?>
    <RmiMapping>
        <mapping interface="edu.youzg.resource_founder.center.IResourceCenter"
                 class="edu.youzg.resource_founder.center.ResourceCenterImpl"></mapping>
    </RmiMapping>
    

    相信很多同学会疑惑:

    为什么 接收端也要有 和发送端一样的 RMI配置文件 呢?

    这是因为:

    当 接收端 接收完毕 指定的文件资源后,接收端也就成了 该资源的拥有者,
    会将自身注册为 该资源的发送端


    全局 日志配置文件 —— log4j.properties:

    配置路径:

    log4j.properties
    

    配置内容:

    # 将等级为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“开源”框架 使用展示》


    若有需要上述代码的同学,本人已将本文所讲解到的代码上传:

    完整 代码:

    如有需要,请点击下方链接:
    Multi-file-self-balancing-cloud-transfer-System

  • 相关阅读:
    Android开源项目发现---TextView,Button篇(持续更新)
    Android 性能分析案例
    Android如何正确的保存文件
    注意android裁图的Intent action
    UI设计师的 Android 备忘录
    添加Fragment注意事项
    在 ActionBar 添加刷新按钮
    显示 SQLite 日志
    MySQL数据库的自动备份与数据库被破坏后的恢复(2)
    MySQL数据库的自动备份与数据库被破坏后的恢复1
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/13544636.html
Copyright © 2011-2022 走看看