This commit is contained in:
binlaab
2026-04-30 12:31:11 +02:00
parent 72899acd74
commit b87b710c50
6 changed files with 125 additions and 4 deletions

BIN
Directory.jar Normal file

Binary file not shown.

BIN
NanoFiles.jar Normal file

Binary file not shown.

View File

@@ -420,8 +420,17 @@ public class DirectoryConnector {
long filesize = -1;
String filehash = null;
FileInfo[] list = this.getFileList();
FileInfo[] foundFile = FileInfo.lookupHashSubstring(list, hashSubstring);
DirMessage requestDL = new DirMessage(DirMessageOps.OPERATION_REQUEST_DIRDL, hashSubstring);
byte[] requestBytes = requestDL.toString().getBytes();
byte[] response = sendAndReceiveDatagrams(requestBytes);
String respStr = new String(response, 0, response.length);
DirMessage respDL = DirMessage.fromString(respStr);
fileData = java.util.Base64.getDecoder().decode(respDL.getFiledata());
filename = respDL.getFilename();
filesize = respDL.getFileSize();
filehash = respDL.getHash();
// TODO: crear nuevo mensaje dirdl y requestdirdl
// similar a un mensaje peerdl

View File

@@ -43,6 +43,11 @@ public class DirMessage {
private static final String FIELDNAME_PEERS = "serverPeers";
private static final String FIELDNAME_FILENAME = "filename";
private static final String FIELDNAME_FILEDATA = "filedata";
private static final String FIELDNAME_FILESIZE = "filesize";
private static final String FIELDNAME_FILEHASH = "filehash";
/**
* Tipo del mensaje, de entre los tipos definidos en PeerMessageOps.
*/
@@ -58,6 +63,11 @@ public class DirMessage {
private FileInfo[] fileList;
private Map<String, InetSocketAddress> peerList;
private String filename;
private String filedata;
private String fileHash;
private long fileSize;
/*
* TODO: (Boletín MensajesASCII) Crear un atributo correspondiente a cada uno de
* los campos de los diferentes mensajes de este protocolo.
@@ -67,6 +77,7 @@ public class DirMessage {
operation = op;
}
public DirMessage(String op, String nick, String ip, int puerto) {
this(op);
this.nick = nick;
@@ -75,9 +86,14 @@ public class DirMessage {
}
public DirMessage(String op, String nick) {
public DirMessage(String op, String field) {
this(op);
this.nick = nick;
if (op.equals(DirMessageOps.OPERATION_SERVE) || op.equals(DirMessageOps.OPERATION_STOP_SERVE)) {
this.nick = field;
} else if (op.equals(DirMessageOps.OPERATION_REQUEST_DIRDL)) {
this.fileHash = field;
}
}
public DirMessage(String op, FileInfo[] filelist) {
@@ -85,6 +101,14 @@ public class DirMessage {
this.fileList = filelist;
}
public DirMessage(String op, String filename, String data, long size, String hash) {
this(op);
this.filename = filename;
this.filedata = data;
this.fileSize = size;
this.fileHash = hash;
}
/*
* TODO: (Boletín MensajesASCII) Crear diferentes constructores adecuados para
* construir mensajes de diferentes tipos con sus correspondientes argumentos
@@ -161,6 +185,37 @@ public class DirMessage {
this.peerList = peers;
}
public String getFilename() {
return this.filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getFiledata() {
return this.filedata;
}
public void setFiledata(String data) {
this.filedata = data;
}
public String getHash() {
return this.fileHash;
}
public void setHash(String h) {
this.fileHash = h;
}
public long getFileSize() {
return this.fileSize;
}
public void setFileSize(Long fs) {
this.fileSize = fs;
}
/**
* Método que convierte un mensaje codificado como una cadena de caracteres, a
@@ -246,6 +301,25 @@ public class DirMessage {
break;
}
case FIELDNAME_FILENAME: {
m.setFilename(value);
break;
}
case FIELDNAME_FILEDATA: {
m.setFiledata(value);
break;
}
case FIELDNAME_FILESIZE: {
m.setFileSize(Long.parseLong(value));
}
case FIELDNAME_FILEHASH: {
m.setHash(value);
break;
}
default:
System.err.println("PANIC: DirMessage.fromString - message with unknown field name " + fieldName);
System.err.println("Message was:\n" + message);
@@ -307,6 +381,16 @@ public class DirMessage {
}
}
break;
case DirMessageOps.OPERATION_REQUEST_DIRDL:
sb.append(FIELDNAME_FILEHASH + DELIMITER + this.fileHash + END_LINE);
break;
case DirMessageOps.OPERATION_DIRDL: // data name size hash
sb.append(FIELDNAME_FILENAME + DELIMITER + this.filename + END_LINE);
sb.append(FIELDNAME_FILEDATA + DELIMITER + this.filedata + END_LINE);
sb.append(FIELDNAME_FILESIZE + DELIMITER + this.fileSize + END_LINE);
sb.append(FIELDNAME_FILEHASH + DELIMITER + this.fileHash + END_LINE);
break;
default:
break;
}

View File

@@ -26,6 +26,11 @@ public class DirMessageOps {
public static final String OPERATION_STOP_SERVE = "stopServe";
public static final String OPERATION_STOP_SERVE_OK = "stopServeOk";
public static final String OPERATION_STOP_SERVE_ERROR = "stopServeError";
public static final String OPERATION_REQUEST_DIRDL = "dirdl";
public static final String OPERATION_FILE_NOT_FOUND = "fileNotFound";
public static final String OPERATION_FILE_AMBIGUOUS = "fileAmbiguous";
public static final String OPERATION_DIRDL = "dirdlData";
// TODO: definir las operaciones del protocolo de directorio

View File

@@ -1,6 +1,7 @@
package es.um.redes.nanoFiles.udp.server;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
@@ -279,6 +280,28 @@ public class NFDirectoryServer {
break;
}
case DirMessageOps.OPERATION_REQUEST_DIRDL: {
String hashSubstring = receivedMsg.getHash();
FileInfo[] found = FileInfo.lookupHashSubstring(directoryFiles, hashSubstring);
if (found.length > 1) {
msgToSend = new DirMessage(DirMessageOps.OPERATION_FILE_AMBIGUOUS);
} else if (found.length == 0) {
msgToSend = new DirMessage(DirMessageOps.OPERATION_FILE_NOT_FOUND);
} else {
FileInfo fi = found[0];
byte[] data = new byte[(int) fi.fileSize];
FileInputStream fis = new FileInputStream(fi.filePath);
fis.read(data);
fis.close();
String b64Data = java.util.Base64.getEncoder().encodeToString(data);
msgToSend = new DirMessage(DirMessageOps.OPERATION_DIRDL, fi.fileName, b64Data, fi.fileSize, fi.fileHash);
break;
}
}
default:
System.err.println("Unexpected message operation: \"" + operation + "\"");
System.exit(-1);