多文件并发传输-------资源与节点的表示
mfct 关于资源与节点的表示
一:资源
这里的资源我们可以理解成 若干文件的集合
一些节点是拥有资源的
1 资源的存储 ***根路径***需要是一样的 而具体的路径可以不同的
2 资源也需要名称、以及ID还有版本号
3 需要文件的片段信息列表 (用于发送接收)
我们知道在接收时 需要依据路径来生成新的文件,并把文件内容写进去
在 进行文件的发送时 也需要先找到文件,同样需要文件路径
4 需要一个可以确定 文件的路径的成员
private String appName;
private String id;
private String version;
private String absoluteRoot;
private List<ResourceStructInfo1> rsiList;
private List<SectionInfo> siList;
ResourceStructInfo1 类 (记录着文件片段的位置)
private int fileHandel;
private String filePath;
private int size;
二:节点
需要标识出是 资源服务器还是 客户端
以及对外提供 port ip 等信息
NetNode 实现这个接口即可
public interface INetNode1 {
int SERVER = 1;
int CLIENT = 0;
String getIp();
int getPort();
int getType();
int getSendTimes();
void increaseSendTimes();
}
三 : 节点和资源的关系
将资源和节点进行联系
节点可以进行注册自己的资源也可以进行 注销自己
// 需要用三个HashMap来存储 两个池子和一个关系
// 因为 每个node 以及resource都需要唯一的标识
// 所以要进行键值对的存储 而不能单纯地只用list 来存储
// 保证是单例的 “static final” 保证线程安全性:“concurrentMap”
public static final ConcurrentHashMap<Integer, List<Integer>> rnRelationMap=
new ConcurrentHashMap<>();
// relationMap是以资源为键 以节点链表为值
// 因为 最后要给接收方发送拥有资源的节点列表 故以资源为键值
public static final ConcurrentHashMap<Integer, INetNode1> netNodePool=
new ConcurrentHashMap<>();
public static final ConcurrentHashMap<Integer, ResourceBaseInfo1> resourcePool=
new ConcurrentHashMap<>();
提供注册、注销、以及由资源 找到 节点列表的方法
还有一个很重要的问题版本号
我们建立一个 资源池子
添加资源的时候需要根据版本号判断一下
boolean addResource(ResourceBaseInfo1 rbi){
String appName=rbi.getAppName();
ResourceBaseInfo1 oldrbi=resourcePool.get(appName);
if(oldrbi !=null) {
if(rbi.getVersion().equals(oldrbi.getVersion())) {
return false;
}
resourcePool.put(appName, rbi);
return true;
}
resourcePool.put(appName, rbi);
return true;
}
为了增加内聚减少耦合,我们将创建一个类
将 资源和发送端接收端绑定
public class SendSectionInfo {
private INetNode receiveNode;
private INetNode sendNode;
private ResourceBaseInfo rbi;
}