empezada implementación peerdl, cambiar DEFAULT_DIRECTORY_HOSTNAME en NanoFiles

This commit is contained in:
binlaab
2026-04-27 09:54:27 +02:00
parent b179408874
commit dc00963c08
7 changed files with 195 additions and 59 deletions

View File

@@ -3,11 +3,13 @@ package es.um.redes.nanoFiles.tcp.server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import es.um.redes.nanoFiles.application.NanoFiles;
import es.um.redes.nanoFiles.tcp.client.NFConnector;
import es.um.redes.nanoFiles.tcp.message.PeerMessage;
import es.um.redes.nanoFiles.tcp.message.PeerMessageOps;
import es.um.redes.nanoFiles.util.FileInfo;
@@ -104,7 +106,7 @@ public class NFServer implements Runnable {
System.out.println("sent " + PeerMessageOps.opcodeToOperation(msgOut.getOpcode()));
}
} catch (IOException e) {
// ???????
e.printStackTrace();
}
}
@@ -207,24 +209,62 @@ public class NFServer implements Runnable {
while(true) {
PeerMessage msgIn = PeerMessage.readMessageFromInputStream(dis);
System.out.println("nfserver - " + msgIn.getOpcode());
switch (msgIn.getOpcode()) {
case PeerMessageOps.OPCODE_REQUEST_PEER_FILES:
System.out.println("hemos llegado a nfserver");
FileInfo[] archivos = NanoFiles.db.getFiles();
for (int i = 0; i < archivos.length; i++) {
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_PEER_FILE);
FileInfo archivo = archivos[i];
System.out.println("Tenemos una lista de archivos de " + archivos.length);
msgOut.setFileHash(archivo.fileHash);
msgOut.setFileSize(archivo.fileSize);
msgOut.setFilenameVal(archivo.filePath + archivo.fileName);
msgOut.setFilenameLong((byte)archivo.fileName.length());
msgOut.setFilenameVal(archivo.fileName);
msgOut.setLast(false);
if (i == archivos.length - 1) msgOut.setLast(true);
if (i == archivos.length - 1) { msgOut.setLast(true); System.out.println("Hemos llegado al último archivo"); };
msgOut.writeMessageToOutputStream(dos);
}
break;
case PeerMessageOps.OPCODE_REQUEST_PEER_DL:
String subHash = msgIn.getFileHash();
int chunkNum = msgIn.getChunkNum();
FileInfo[] files = FileInfo.lookupHashSubstring(NanoFiles.db.getFiles(), subHash);
if (files.length == 0) {
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_FILE_NOT_FOUND);
msgOut.writeMessageToOutputStream(dos);
break;
} else if (files.length > 1) {
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_AMBIGUOUS);
msgOut.writeMessageToOutputStream(dos);
break;
}
String path = NanoFiles.db.lookupFilePath(files[0].fileHash);
try (RandomAccessFile raf = new RandomAccessFile(path, "r")) {
long chunk = (long) chunkNum * NFConnector.CHUNK_SIZE;
int bytesALeer = (int) Math.min(NFConnector.CHUNK_SIZE, raf.length() - chunk);
// si quedan menos de CHUNK_SIZE bytes restantes, readFully se quedaría esperando
// a rellenar el buffer, lo cual no va a pasar
if (bytesALeer > 0) {
byte[] datos = new byte[bytesALeer];
raf.seek(chunk);
raf.readFully(datos);
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_PEER_DL);
msgOut.setFileData(datos);
msgOut.writeMessageToOutputStream(dos);
}
} catch (IOException e) {
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_PEER_DL_ERROR);
msgOut.writeMessageToOutputStream(dos);
}
break;
}
}