资源发送端

  • Provider
  • SenderServer
  • SenderDetail
  • ResourcePool.


资源发送端的功能
1.注册资源
2.注销资源
3.资源发送

对于注册资源和注销资源来说这两大功能一直都是资源提供者所实现的,资源发送端应用了资源提供者的功能,并且自身又进行了资源发送功能的扩展。

Provider

/*
*资源提供者:专注于资源的注册和注销的功能
*/
public class Provider {private rmiCilent rc;private static int PORT = 54200;private static String IP = "192.168.230.1";private CilentProxy cp;private int RegisterPort = PORT;private String RegisterIp = IP;private static NetNode self = new NetNode();static {self.setIp(getSelfIp());self.setPort(54188);}public Provider() {this.RegisterIp = IP;this.RegisterPort = PORT;this.cp = new CilentProxy();this.rc = new rmiCilent();this.rc.setId(RegisterIp);this.rc.setPort(RegisterPort);this.cp.setRmicilent(this.rc);  }public void setPort(int selfPort) {self.setPort(selfPort);}public int getPort() {return self.getPort();}/**注册单项服务*/public void register(String name) {List<String> list = new ArrayList<String>();list.add(name);     IRegister ir = cp.getProxy(IRegister.class);//进行短连接注册中心,进行注册ir.registServer(self, list);}/**注销本地服务*/public void LogoutResource() {  IRegister ir = cp.getProxy(IRegister.class);ir.logOutServer(self); }/**注册多项服务*/public void registeAll(List<String> nameList) {IRegister ir = cp.getProxy(IRegister.class);//进行短连接注册中心,进行注册ir.registServer(self, nameList);}public static String getSelfIp() {try {InetAddress address = InetAddress.getLocalHost();String ip = address.getHostAddress();return ip;} catch (UnknownHostException e) {e.printStackTrace();}return null;}}

SenderServer

/*
*可以直接进行使用的资源接收端的入口类
*提供注册和注销资源的调用方法供用户使用
*/
@rmiInterface(rmiter = Isender.class)
public class SenderServer implements Isender{private rmiServer sr;//作为短连接的服务器端,用于进行本地资源的发送private ResourcePool rp;private Provider provider;public SenderServer() {provider = new Provider();       rp = new ResourcePool();//对于这个ReourcePool来说,用于发送端存储提供给接收端的资源sr = new rmiServer();}public void setPort(int port) {provider.setPort(port);}public void start() {     sr.setPort(provider.getPort());sr.start();}public void RegisteResource(String name) {provider.register(name);}/**将默认路径上的所有资源都进行注册*/public void registeAllResource() {       //在此之前发送端已经进行设置默认的本地需要注册资源的路径       Set<String> resourceList = rp.getResourceName();List<String> list = new ArrayList<String>();for(String one : resourceList) {list.add(one);}provider.registeAll(list);}public void LogoutResource() {provider.LogoutResource();}/**将本地拥有的资源基本信息存在本地缓存中*存储单项资源基本信息*/public void addResource(String resourceName) {rp.addResource(resourceName);//发送端将本地的资源存储到发送端缓存中}/**用户设置需要在缓存中存储本地下哪个目录下的资源*resourceRoot表示为资源根目录*之后可直接通过资源的名称可以直接将本地资源的基本信息存入缓存*/                                          public void setResoureRoot(String resourceRoot) {//先将注册的资源进行整理rp.setLocalRoot(resourceRoot);}/*
*响应接收端短连接响应的方法
*开启发送线程,链接接收端,并且进行片段发送
*/@Overridepublic void send(NetNode receive, ResourceInfo ri) {senderDetail sd = new senderDetail(receive, ri, rp);       new Thread(sd).start(); }}

SenderDetail

资源发送端真正的资源发送的管理类。

public class SenderDetail implements Runnable{//对于一个发送端来说事实上是一个短连接的过程,一次发送private NetNode receive;private Socket socket;private DataOutputStream dos;private ResourceInfo ri;private Map<String, RandomAccessFile> rafPool;private RandAccessFilePool rfp;private ResourcePool rcp;public SenderDetail(NetNode receive, ResourceInfo ri,ResourcePool rp) {this.receive =receive;this.rcp = rp;rafPool = new HashMap<String, RandomAccessFile>();String root = rp.getResourceInfo(ri.getResourceName()).getRoot();this.ri = ri;//得到的为接收端发过来的资源,需要对本地的目录进行更改this.ri.setRoot(root);rfp = new RandAccessFilePool();}@Overridepublic void run() {connectServer();send();close();}private void connectServer() {  try {socket = new Socket(receive.getIp(), receive.getPort());dos = new DataOutputStream(socket.getOutputStream());} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private void send() {String root = this.ri.getRoot();List<FileHead> headList = ri.getFileHeadList();Map<Integer, FileInfo> fileInfoMap = ri.getFileInfoMap();int i;for( i = 0; i < headList.size(); i++) {FileHead fh = headList.get(i);String address = root + fileInfoMap.get(fh.getFileHandle()).getFileRoot();RandomAccessFile raf;try {raf = rfp.getReadRaf(address);int size = fh.getSectionLength();byte[] bytes = new byte[size];raf.seek(fh.getOffset());raf.read(bytes);TransferDetail td = new TransferDetail();td.writeBytes(dos, fh.getHeadBytes());td.writeBytes(dos, bytes);} catch (FileNotFoundException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}}        closeFile();    }private void close() {try {if (dos != null) {dos.close();}} catch (IOException e) {} finally {dos = null;}try {if (socket != null && !socket.isClosed()) {socket.close();}} catch (IOException e) {} finally {socket = null;}}private void closeFile() {for (RandomAccessFile raf : rafPool.values()) {try {raf.close();} catch (IOException e) {}}}
}

ResourcePool.

资源发送端的本地缓存,将本地磁盘的资源的基本信息进行缓存,减少了不必要的IO操作,节省了系统资源,加快了访问速度。

public class ResourcePool {//对于每个发送端来说,都要自己的一个本地资源库private static final Map<String, ResourceInfo> resourcePool = new HashMap<String, ResourceInfo>();;private static final String DEFAULT_LOCAL_ROOT = "E:\\KSG\\";//每个发送端应该明确自己的资源默认的根路径private String LocalRoot = DEFAULT_LOCAL_ROOT;//有默认值,但是发送端可以进行设置//在这里仅仅表示的是服务器端资源的根路径  public ResourcePool() { }//通过查找本地路径生成这个map,public String getLocalRoot() {return LocalRoot;}public void setLocalRoot(String localRoot) {LocalRoot = localRoot;}public void addResource(String resourceName) {//例如这里使用输入QQ类似的民称//则应该在"E:\\KSG\\QQ"这个文件下进行资源的查找,形成ResourceInfo,并且在//resource中的root就是E:\\KSG,那么接收端收到相关的resource之后,需要将root改为//自定义的root,因为当接收端拥有完整的资源后,接收端可能变为下一个发送端,它在发送的时候//也需要确定自己的root,//TODO 根据路径进行多个文件的查找组成一个文件的map,并且构造出resourceString findAdress = LocalRoot + resourceName;//发送端拥有资源的本地全称ResourceInfo ri = new ResourceInfo();ri.setResourceName(resourceName);ri.setRoot(LocalRoot);ri.setVersion(0);//根据资源的路径,得到资源的一些信息,因为一个资源包括很多文件,或者是目录,那么需要//将资源的左右文件记录在案,并且需要知道每个文件的具体的一些信息,长度,相对路径makeResource(findAdress, ri, resourceName);          }public void makeResource(String address, ResourceInfo ri, String ResourceName) {File file = new File(address);if(!file.exists()) {//表明资源文件地址错误或没有return;}File[] files = file.listFiles();for(int i = 0; i < files.length; i++) {File currentfile = files[i];if(currentfile.isFile()) {String currentPath = files[i].getAbsolutePath();//fileINfo用来描述的是资源下每一个文件的的具体信息//包括文件的相对地址,文件的长度,因为这是为后期在资源的传送的时候确保完整的一个条件FileInfo fi = new FileInfo();//得到当前的相对路经fi.setFileRoot(currentPath.replace(LocalRoot, ""));//相对路径为当前路径去掉绝对路径fi.setFileLength(currentfile.length());int fileHash = fi.hashCode();//设置每个文件的句柄,每个文件的句柄采用的是文件的相对路径和文件的长度进行衡量fi.setFileHandle(fileHash);ri.addFileInfo(fileHash,fi);resourcePool.put(ResourceName, ri);}else {String name = files[i].getName();String path = address + "\\" + name;makeResource(path, ri, ResourceName);}       }   }public ResourceInfo getResourceInfo(String ResourceName) {return resourcePool.get(ResourceName);}public Set<String> getResourceName(){return resourcePool.keySet();}
}

多文件自平衡云传输(四)资源发送端 —————— 开开开山怪相关推荐

  1. 在线web免登陆云传输工具推荐【青蛙快传】

    一个比较好用的文件或者文本云传输工具,在线web版的,重要的是不需要登录,不需要登录,不需要登录! 优点1:无需登录,急速快传 优点2:手机电脑互传文件 优点3:不用安装软件,仅一个网址 青蛙快传 h ...

  2. [Java]分布式自平衡多文件云传输

    [Java]分布式自平衡多文件云传输 概述 基本思想 节点 Receiver接收方 资源分配及节点选择策略类 接收服务器端口池 资源请求类 短连接资源请求接口 资源信息类 资源节点关系表(资源管理中心 ...

  3. 电脑与云服务器传输文件,电脑与云服务器传输文件

    电脑与云服务器传输文件 内容精选 换一换 当创建文件系统后,您需要使用云服务器来挂载该文件系统,以实现多个云服务器共享使用文件系统的目的.本章节以Windows 2012版本操作系统为例进行CIFS类 ...

  4. http服务器 如何传输文件,http服务器 如何传输文件

    http服务器 如何传输文件 内容精选 换一换 华为云主机迁移服务帮助中心,为用户提供产品简介.快速入门.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用主机迁移服务. ...

  5. 弹性服务器怎么上传文件,上传哪个文件夹弹性云服务器

    上传哪个文件夹弹性云服务器 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 本节 ...

  6. 读取云服务器文件列表,读取云服务器文件列表

    读取云服务器文件列表 内容精选 换一换 登录Windows操作系统的弹性云服务器时,需使用密码方式登录.因此,用户需先根据创建弹性云服务器时使用的密钥文件,获取该弹性云服务器初始安装时系统生成的管理员 ...

  7. 虚拟服务器传文件,虚拟机与主机传输文件

    虚拟机与主机传输文件 内容精选 换一换 云堡垒机支持文件传输功能,以及审计传输的文件.Linux主机和Windows主机的文件传输方式有所区别.Linux主机上传/下载文件,可选择Web运维和FTP/ ...

  8. 以“国土资源云”统领国土资源信息化建设

    以"国土资源云"统领国土资源信息化建设       2015-02-05 | 作者: 程秀娟 | 来源: 中国国土资源报 | [大中 小][打印][关闭]   1月26日,国土资源 ...

  9. 手机怎么向服务器传文件,手机向云服务器传文件

    手机向云服务器传文件 内容精选 换一换 登录Windows操作系统的弹性云服务器时,需要使用密码方式登录.此时,用户需要先根据购买弹性云服务器时下载的私钥文件,获取该弹性云服务器初始安装时系统生成的管 ...

  10. 手机 服务器文件,手机查看云服务器文件

    手机查看云服务器文件 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 密钥对鉴权 ...

最新文章

  1. HDLBits 系列(29)PS/2 mouse protocol(PS/2 packet parser and datapath)
  2. 【Vue.js】vue用户登录功能
  3. classpath*: 和classpath:有什么区别_我们可以从Java“HelloWorld”中学到什么?
  4. SpringMVC视图解析器
  5. mysql 清空表的两种方法
  6. 手写体识别代码_机器人如何在复杂的环境下进行视觉识别?
  7. (12)FPGA时钟设计原则
  8. Web 实时推送技术如何弥补 HTTP 协议的缺陷? | 技术头条
  9. linux自动切换tty,Linux 中不适用功能键切换TTY
  10. Unicode字符集和编码方式
  11. OpenCV_Corner Detect with FastFeatureDetector(基于FAST的角点检测) 及 SUSAN算子
  12. 无边框Button(WPF)
  13. 史上最详细的Maven安装教程以及Maven和eclipse集成
  14. 苹果手机显示“更新验证失败 因为您不再连接到互联网”怎么办?
  15. 7z001怎么解压在安卓手机上面_安卓手机用户换iPhone11怎么转移手机便签内容?...
  16. Ubuntu Desktop - Disks
  17. 关于sdcard读写速率慢的问题排查
  18. 接口测试到底测试什么?
  19. java png生成webp图片_jpg、png格式的图片转换成webp后颜色失真的问题
  20. 全国各IT领军城市软件和服务外包Q群

热门文章

  1. mac php 单元测试,PHPUnit单元测试
  2. 微信“小程序”要来了,简单点,解释的方式简单点
  3. 使用Perfmon和PAL工具查看Server性能--PerfMon入门指南
  4. 送书6本,看谁答题快
  5. 高校大学生可以免费领半年阿里云服务器
  6. 串行通信——异步串行通信
  7. [Angular] - 01 Architecture and workflow
  8. 【CRM】CRM开发中常用表
  9. 2021-05-11PLC通信Libnodave-明天继续
  10. cortex a7 a53_试驾初体验--我与奥迪A7的七天之旅