【Java项目】多文件传输:资源请求者

1、资源请求者职责

  1. 向注册中心,请求服务。
  2. 向服务器,请求资源。

在这里插入图片描述

2. 与注册中心建立通信

  1. 建立RMI通信
	  //代理对象,与注册中心进行沟通
    private IResourceRegistryCenterAction center;
/**
     * 配置服务器 ip和端口号
     * @param configPath configPath 配置文件
     * @throws IOException
     */
public ResourceReceiver(String configPath) throws IOException {
        try {
            PropertiesParse propertiesParse = new PropertiesParse();
            propertiesParse.loadProperties(configPath);
            RMIClient centerClient = new RMIClient();
            centerClient.setPort(Integer.parseInt(propertiesParse.value("registerCenterPort")));
            centerClient.setIp(propertiesParse.value("registerCenterIp"));
            //获取代理对象,与注册中心进行沟通
            center = centerClient.getProxy(IResourceRegistryCenterAction.class);
    }

3. 与资源拥有者建立通信

1.建立RMI 通信

   private RMIClient resourceClient;
   //获取与资源拥有者建立通信代理
   private IResourceHolderAction resourcer;
   
	 public ResourceReceiver(String configPath) throws IOException {
        try {
            resourceClient = new RMIClient();
            resourceClient.setIp(propertiesParse.value("resourcerPort"));
            resourceClient.setPort(Integer.parseInt(propertiesParse.value("resourcerIp")));
            resourcer = resourceClient.getProxy(IResourceHolderAction.class);
        } catch (NotInterfaceClassException e) {
            e.printStackTrace();
        }
    }

4. 发送端选择策略

提供给用户,选择接受端。

  1. 策略接口
package man.kuke.core;

import man.kuke.registry.Node;

import java.util.List;

/**
 * @author: kuke
 * @date: 2020/12/14 - 18:21
 * @description:
 */
public interface ISenderSelectedStrategy {
    /**
     * 用户选择发送端
     * @param senderList 发送端地址
     * @param maxSenderCount 最大发送个数
     * @return 选择的发送端
     */
    List<Node> selectNode(List<Node> senderList, int maxSenderCount);
}


  1. 默认策略
package man.kuke.core;

import man.kuke.registry.Node;

import java.util.List;

/**
 * @author: kuke
 * @date: 2020/12/14 - 18:23
 * @description:
 */
public class DefaultSenderSelectedStrategy implements ISenderSelectedStrategy {
    @Override
    public List<Node> selectNode(List<Node> senderList, int maxSenderCount) {
        return null;
    }
}

4.服务请求

 /**
     * 资源请求者请求资源
     * 1. 获取文件信息
     * 2. 向注册中心请求服务地址
     * 3. 对文件进行分割
     * 4. 建立接收服务器
     * 5. 选择发送端
     * 6. 向发送端发送资源请求
     * @param resourceInfo 资源信息
     * @param absolutePath 本地绝对路径,用设置存放目录
     */
    public void requestResourcesService(ResourceInfo resourceInfo,String absolutePath) {
        //     * 1. 获取文件信息
        List<FileInfo> fileInfos = new ArrayList<>();
        Iterator<FileInfo> fileInfoIterator = resourceInfo.fileInfoAccessor();
        while(fileInfoIterator.hasNext()) {
            fileInfos.add(fileInfoIterator.next());
        }
        
        int id = resourceInfo.getId();
        // * 2. 向注册中心请求服务地址
        List<Node> resourceOwners = center.getResourceOwners(id);
        //  * 5. 选择发送端
        resourceOwners = senderSelectedStrategy.selectNode(resourceOwners, maxSenderCount);
        int size = resourceOwners.size();

        // * 3. 对文件进行分割
        ResourceSpliter resourceSpliter = new ResourceSpliter();
        List<List<SectionHander>> filesSplit = resourceSpliter.filesSplit(fileInfos, size);
        // * 4. 建立接收服务器
        ReceiveServer receiveServer = new ReceiveServer(size, absolutePath, resourceInfo);
        receiveServer.startup();

        // * 6. 向发送端发送资源请求
        int index = 0;
        for (Node resourceOwner : resourceOwners) {
            List<SectionHander> sectionHanders = filesSplit.get(index++);
            resourceClient.setPort(resourceOwner.getPort());
            resourceClient.setIp(resourceOwner.getIp());
            new Thread(new Runnable() {
                @Override
                public void run() {
                    resourcer.dealResourceRequest(id,me,sectionHanders);
                    //TODO 注册资源
                }
            }).start();
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值