mirror of
https://github.com/binlaab/nanofiles.git
synced 2026-07-01 13:57:21 +02:00
empezada implementación peerdl, cambiar DEFAULT_DIRECTORY_HOSTNAME en NanoFiles
This commit is contained in:
@@ -2,16 +2,22 @@ package es.um.redes.nanoFiles.logic;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Map;
|
||||
import java.io.IOException;
|
||||
import java.io.RandomAccessFile;
|
||||
|
||||
import es.um.redes.nanoFiles.tcp.client.NFConnector;
|
||||
import es.um.redes.nanoFiles.application.NanoFiles;
|
||||
|
||||
|
||||
|
||||
import es.um.redes.nanoFiles.tcp.server.NFServer;
|
||||
import es.um.redes.nanoFiles.udp.client.DirectoryConnector;
|
||||
import es.um.redes.nanoFiles.util.FileDigest;
|
||||
import es.um.redes.nanoFiles.util.FileInfo;
|
||||
import es.um.redes.nanoFiles.util.FileNameUtil;
|
||||
|
||||
public class NFControllerLogicP2P {
|
||||
// Servidor TCP local para compartir ficheros con otros peers
|
||||
@@ -159,34 +165,33 @@ public class NFControllerLogicP2P {
|
||||
// TODO: localizar peers con el hash solicitado (o uno concreto) y delegar en
|
||||
// downloadFileFromServers
|
||||
boolean success = false;
|
||||
LinkedList<InetSocketAddress> peersWithFile = new LinkedList<>();
|
||||
Map<String, InetSocketAddress> peers = dirLogic.fetchPeerList();
|
||||
|
||||
LinkedList<InetSocketAddress> targets = new LinkedList<>();
|
||||
|
||||
/* if (targetPeerNickname == "*") { bloqueado de momento
|
||||
targets.addAll(peers.values());
|
||||
} else { */
|
||||
targets.add(peers.get(targetPeerNickname));
|
||||
// }
|
||||
|
||||
for (InetSocketAddress addr : targets) {
|
||||
if (targetPeerNickname == "*") {
|
||||
Map<String, InetSocketAddress[]> peersWithFile = new HashMap<String, InetSocketAddress[]>();
|
||||
try {
|
||||
NFConnector nfc = new NFConnector(addr);
|
||||
DirectoryConnector dc = new DirectoryConnector(dirLogic.getDirectoryHostname()); // la verdad que debería poder sacarlo de dirLogic
|
||||
peersWithFile = dc.searchFilesByHash(targetHashSubstring);
|
||||
|
||||
} catch (IOException e) { e.printStackTrace(); }
|
||||
success = downloadFileFromServers(peersWithFile.values().iterator().next(), peersWithFile.keySet().iterator().next()); // dios
|
||||
} else {
|
||||
try {
|
||||
InetSocketAddress[] peerAddr = new InetSocketAddress[] {dirLogic.fetchPeerList().get(targetPeerNickname)};
|
||||
NFConnector nfc = new NFConnector(peerAddr[0]);
|
||||
FileInfo[] peerFiles = nfc.getFileList();
|
||||
|
||||
// la longitud tiene que ser EXACTAMENTE 1, si es 0 no hay, si es > 1 es ambiguo
|
||||
// y si resulta que dos peers tienen un mismo subhash sin tener el mismo hash?
|
||||
// mando que no se ha podido descargar? comparo contra el hash del primero?
|
||||
FileInfo[] peerFilesFound = FileInfo.lookupHashSubstring(peerFiles, targetHashSubstring);
|
||||
if (peerFilesFound.length == 1) {
|
||||
peersWithFile.add(addr);
|
||||
FileInfo[] found = FileInfo.lookupHashSubstring(peerFiles, targetHashSubstring);
|
||||
if (found.length > 1) {
|
||||
System.err.println("The hash substring provided is ambiguous");
|
||||
return success;
|
||||
} else if (found.length == 0) {
|
||||
System.err.println("The hash substring provided could not be found in peer " + targetPeerNickname);
|
||||
return success;
|
||||
}
|
||||
|
||||
success = downloadFileFromServers(peerAddr, found[0].fileHash); // voy a darle el hash entero, más fácil que volver a buscarlo
|
||||
} catch (IOException e) { e.printStackTrace(); }
|
||||
System.out.println("Hemos descargado algo? success = " + success);
|
||||
}
|
||||
|
||||
success = downloadFileFromServers(peersWithFile.toArray(new InetSocketAddress[0]), targetHashSubstring);
|
||||
|
||||
return success;
|
||||
}
|
||||
/**
|
||||
@@ -196,7 +201,7 @@ public class NFControllerLogicP2P {
|
||||
* que se conectará
|
||||
* @param targetHashSubstring Subcadena del hash del fichero a descargar
|
||||
*/
|
||||
protected boolean downloadFileFromServers(InetSocketAddress[] serverAddressList, String targetHashSubstring) {
|
||||
protected boolean downloadFileFromServers(InetSocketAddress[] serverAddressList, String targetHash) {
|
||||
boolean downloaded = false;
|
||||
|
||||
if (serverAddressList.length == 0) {
|
||||
@@ -207,14 +212,42 @@ public class NFControllerLogicP2P {
|
||||
// pedido, obtener nombre remoto, reservar nombre local sin colisiones, alternar
|
||||
// descarga de chunks y verificar hash final. Cerrar los sockets al terminar.
|
||||
|
||||
|
||||
long filesize = -1;
|
||||
String filename = "";
|
||||
|
||||
NFConnector[] peerConns = new NFConnector[serverAddressList.length];
|
||||
|
||||
for (int i = 0; i < serverAddressList.length; i++) {
|
||||
try {
|
||||
NFConnector nfc = new NFConnector(serverAddressList[i]);
|
||||
if (filesize == -1) {
|
||||
FileInfo[] files = nfc.getFileList();
|
||||
FileInfo fileToDownload = FileInfo.lookupHashSubstring(files, targetHash)[0]; // espero solo un archivo
|
||||
filesize = fileToDownload.fileSize;
|
||||
filename = toDisplayPath(FileNameUtil.chooseAvailableName(fileToDownload.fileName));
|
||||
}
|
||||
peerConns[i] = nfc;
|
||||
} catch (IOException e) { e.printStackTrace(); }
|
||||
}
|
||||
|
||||
|
||||
try (RandomAccessFile raf = new RandomAccessFile(NanoFiles.sharedDirname + "/" + filename, "rw")) {
|
||||
raf.setLength(filesize);
|
||||
int chunks = (int) Math.ceil((double) filesize / NFConnector.CHUNK_SIZE);
|
||||
|
||||
for (int i = 0; i < chunks; i++) {
|
||||
NFConnector nfc = peerConns[i % peerConns.length];
|
||||
if (!nfc.downloadChunk(targetHash, i, raf)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
downloaded = true;
|
||||
} catch (IOException e) { e.printStackTrace(); }
|
||||
|
||||
downloaded = targetHash.equals(FileDigest.computeFileChecksumString(NanoFiles.sharedDirname + "/" + filename));
|
||||
|
||||
return downloaded;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user