多文件并发传输------- 节点选择策略以及资源分配策略
节点选择策略以及资源分配策略
节点的选择 :
当接收端发出文件请求时 资源信息中心 会给一张拥有该资源的列表
这时候 我们可以选择发送次数相对较少的节点进行发送
并给这些节点 平均的分配 这个资源的片段
// 利用桶排序
// 将发送次数作为下标
// 发送过对用次数的节点数量是 值
// 选取 maxSenderCount 个节点
private List<INetNode1> selectMinSendCount(List<INetNode1> nodeList) {
List<INetNode1> resultNodeList = new ArrayList<>();
INetNode1 maxNode = nodeList.get(0);
for (int index = 0; index < nodeList.size(); index++) {
INetNode1 node = nodeList.get(index);
if (maxNode.getSendTimes() < node.getSendTimes()) {
maxNode = node;
}
}
int[] sendCount = new int[maxNode.getSendTimes()];
for (INetNode1 node : nodeList) {
++sendCount[node.getSendTimes()];
}
int maxSenderCount = this.maxSenderCount;
for (int index = 0; index < sendCount.length; index++) {
if (maxSenderCount < 0) {
sendCount[index] = 0;
} else {
maxSenderCount -= sendCount[index];
if (maxSenderCount < 0) {
sendCount[index] += maxSenderCount;
}
}
}
for (INetNode1 node : nodeList) {
int index = node.getSendTimes();
if (sendCount[index] <= 0) {
continue;
}
resultNodeList.add(node);
sendCount[index]--;
}
return resultNodeList;
}
资源的分配;
// 将资源基础信息里面的 资源框架信息列表·
// 按照 各个文件片段按依据senderCount 进行分割
// 最后每一个发送端都只发送相应的 各个文件里面的对应片段
public List<SectionInfo>[] allocationSection(List<SectionInfo> orgResource, int sendCount) {
if (sendCount <= 0) {
return null;
}
Object[] result = new Object[sendCount];
for (int index = 0; index < result.length; index++) {
List<SectionInfo> sectionList = new ArrayList<>();
result[index] = sectionList;
}
int index = 0;
for (SectionInfo section : orgResource) {
// 当片段的长度已经 小于要分割成的片段的长度时
// 直接加到片段数组里面
int sectionSize = section.getSize();
if (sectionSize <= maxSectionLength) {
List<SectionInfo> sectionList = (List<SectionInfo>) result[index];
sectionList.add(new SectionInfo(section));
index = (index + 1) % sendCount;
continue;
}
// 片段比较大时将片段分割成小块
// 并加入 片段数组里面
long offset = 0L;
int restLen = sectionSize;
int len;
while (restLen > 0) {
len = restLen > maxSectionLength ? maxSectionLength : restLen;
List<SectionInfo> sectionList = (List<SectionInfo>) result[index];
sectionList.add(new SectionInfo(section.getFileHandle(),
offset + section.getOffset(), len));
offset += len;
restLen -= len;
index = (index + 1) % sendCount;
}
}
return (List<SectionInfo>[]) result;
}