This commit is contained in:
2026-04-25 14:26:35 +02:00
parent c0fb933fce
commit 0cf758943b
10 changed files with 216 additions and 88 deletions

View File

@@ -9,6 +9,7 @@ import es.um.redes.nanoFiles.application.NanoFiles;
import es.um.redes.nanoFiles.tcp.server.NFServer; import es.um.redes.nanoFiles.tcp.server.NFServer;
import es.um.redes.nanoFiles.util.FileInfo;
public class NFControllerLogicP2P { public class NFControllerLogicP2P {
// Servidor TCP local para compartir ficheros con otros peers // Servidor TCP local para compartir ficheros con otros peers
@@ -129,6 +130,18 @@ public class NFControllerLogicP2P {
protected boolean listPeerFiles(InetSocketAddress peerAddr) { protected boolean listPeerFiles(InetSocketAddress peerAddr) {
boolean success = false; boolean success = false;
try {
NFConnector nfc = new NFConnector(peerAddr);
FileInfo[] filelist = nfc.getFileList();
if (filelist == null) return success;
System.out.println("Files available in peer: ");
FileInfo.printToSysout(filelist);
success = true;
} catch (IOException e) {}
return success; return success;

View File

@@ -9,6 +9,7 @@ import java.net.Socket;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.LinkedList;
import es.um.redes.nanoFiles.tcp.message.PeerMessage; import es.um.redes.nanoFiles.tcp.message.PeerMessage;
import es.um.redes.nanoFiles.tcp.message.PeerMessageOps; import es.um.redes.nanoFiles.tcp.message.PeerMessageOps;
@@ -35,8 +36,10 @@ public class NFConnector {
* partir de los streams de entrada/salida del socket creado. Se usarán para * partir de los streams de entrada/salida del socket creado. Se usarán para
* enviar (dos) y recibir (dis) datos del servidor. * enviar (dos) y recibir (dis) datos del servidor.
*/ */
try {
socket = new Socket(serverAddr.getAddress(), serverAddr.getPort()); socket = new Socket(fserverAddr.getAddress(), fserverAddr.getPort());
} catch (Exception e) { e.printStackTrace(); }
dis = new DataInputStream(socket.getInputStream()); dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream()); dos = new DataOutputStream(socket.getOutputStream());
@@ -57,11 +60,11 @@ public class NFConnector {
System.out.println("received " + intNumber); System.out.println("received " + intNumber);
*/ */
try { try {
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_REQUEST_PEER_FILES); PeerMessage msgOut = new PeerMessage((byte) 1);
msgOut.writeMessageToOutputStream(dos); msgOut.writeMessageToOutputStream(dos);
System.out.println("sent " + PeerMessageOps.opcodeToOperation(msgOut.getOpcode())); System.out.println("sent " + PeerMessageOps.opcodeToOperation(msgOut.getOpcode()));
PeerMessage msgIn = PeerMessage.readMessageFromInputStream(dis); PeerMessage msgIn = PeerMessage.readMessageFromInputStream(dis);
System.out.println("received " + PeerMessageOps.opcodeToOperation(msgIn.getOpcode())); System.out.println("received " + msgIn.getOpcode() + " " + PeerMessageOps.opcodeToOperation(msgIn.getOpcode()));
System.out.println("(" + new SimpleDateFormat("HH:mm:ss:SS").format(new Date())); System.out.println("(" + new SimpleDateFormat("HH:mm:ss:SS").format(new Date()));
if (msgIn.getOpcode() == PeerMessageOps.OPCODE_PEER_FILE) { if (msgIn.getOpcode() == PeerMessageOps.OPCODE_PEER_FILE) {
System.out.println("file content: "); System.out.println("file content: ");
@@ -76,8 +79,30 @@ public class NFConnector {
} }
public FileInfo[] getFileList() {
try {
LinkedList<FileInfo> filelist = new LinkedList<>();
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_REQUEST_PEER_FILES);
msgOut.writeMessageToOutputStream(dos);
PeerMessage msgIn = PeerMessage.readMessageFromInputStream(dis);
if (msgIn.getOpcode() == PeerMessageOps.OPCODE_PEER_FILE) {
boolean last = false;
while (!last) {
long size = msgIn.getFileSize();
String hash = msgIn.getFileHash();
String name = msgIn.getFilenameVal();
FileInfo file = new FileInfo(hash, name, size, null);
filelist.add(file);
last = msgIn.getLast();
if (!last) msgIn = PeerMessage.readMessageFromInputStream(dis); // tengo que ver si puedo hacerlo diferente
}
} else { return null; }
return filelist.toArray(new FileInfo[0]);
} catch (IOException e) { e.printStackTrace(); return null; }
}
public InetSocketAddress getServerAddr() { public InetSocketAddress getServerAddr() {
return serverAddr; return serverAddr;

View File

@@ -107,12 +107,13 @@ public class PeerMessage {
* Usar dis.readFully para leer un array de bytes, dis.readInt para leer un * Usar dis.readFully para leer un array de bytes, dis.readInt para leer un
* entero, etc. * entero, etc.
*/ */
PeerMessage message = new PeerMessage();
byte opcode = dis.readByte(); byte opcode = dis.readByte();
PeerMessage message = new PeerMessage(opcode);
switch (opcode) { switch (opcode) {
case PeerMessageOps.OPCODE_REQUEST_PEER_FILES: case PeerMessageOps.OPCODE_REQUEST_PEER_FILES:
case PeerMessageOps.OPCODE_PEER_FILES_ERROR: break; case PeerMessageOps.OPCODE_PEER_FILES_ERROR: break;
case PeerMessageOps.OPCODE_PEER_FILE: { case PeerMessageOps.OPCODE_PEER_FILE: {
boolean last = false; boolean last = false;
byte lastVal = dis.readByte(); byte lastVal = dis.readByte();
@@ -134,6 +135,7 @@ public class PeerMessage {
message.setFileHash(new String(fileHash)); message.setFileHash(new String(fileHash));
message.setFilenameLong(filenameLong); message.setFilenameLong(filenameLong);
message.setFilenameVal(new String(filenameVal)); message.setFilenameVal(new String(filenameVal));
break;
} }
@@ -156,6 +158,7 @@ public class PeerMessage {
*/ */
dos.writeByte(opcode); dos.writeByte(opcode);
System.out.println(opcode);
switch (opcode) { switch (opcode) {
case PeerMessageOps.OPCODE_REQUEST_PEER_FILES: case PeerMessageOps.OPCODE_REQUEST_PEER_FILES:
case PeerMessageOps.OPCODE_PEER_FILES_ERROR: break; case PeerMessageOps.OPCODE_PEER_FILES_ERROR: break;

View File

@@ -0,0 +1,39 @@
package es.um.redes.nanoFiles.tcp.message;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class PeerMessageTest {
public static void main(String[] args) throws IOException {
String nombreArchivo = "peermsg.bin";
DataOutputStream fos = new DataOutputStream(new FileOutputStream(nombreArchivo));
/*
* TODO: Probar a crear diferentes tipos de mensajes (con los opcodes válidos
* definidos en PeerMessageOps), estableciendo los atributos adecuados a cada
* tipo de mensaje. Luego, escribir el mensaje a un fichero con
* writeMessageToOutputStream para comprobar que readMessageFromInputStream
* construye un mensaje idéntico al original.
*/
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_REQUEST_PEER_FILES);
msgOut.writeMessageToOutputStream(fos);
DataInputStream fis = new DataInputStream(new FileInputStream(nombreArchivo));
PeerMessage msgIn = PeerMessage.readMessageFromInputStream((DataInputStream) fis);
/*
* TODO: Comprobar que coinciden los valores de los atributos relevantes al tipo
* de mensaje en ambos mensajes (msgOut y msgIn), empezando por el opcode.
*/
if (msgOut.getOpcode() != msgIn.getOpcode()) {
System.out.println(msgOut.getOpcode() + " " + msgIn.getOpcode());
System.err.println("Opcode does not match!");
}
}
}

View File

@@ -7,6 +7,11 @@ import java.net.InetSocketAddress;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import es.um.redes.nanoFiles.application.NanoFiles;
import es.um.redes.nanoFiles.tcp.message.PeerMessage;
import es.um.redes.nanoFiles.tcp.message.PeerMessageOps;
import es.um.redes.nanoFiles.util.FileInfo;
@@ -78,12 +83,26 @@ public class NFServer implements Runnable {
DataInputStream dis = new DataInputStream(socket.getInputStream()); DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
int intNumber = dis.readInt(); /* int intNumber = dis.readInt();
System.out.println("received " + intNumber); System.out.println("received " + intNumber);
int newInt = intNumber + 1; int newInt = intNumber + 1;
dos.writeInt(newInt); dos.writeInt(newInt);
System.out.println("sent " + newInt); System.out.println("sent " + newInt); */
PeerMessage msgIn = PeerMessage.readMessageFromInputStream(dis);
System.out.println("received " + msgIn.getOpcode() + " " + PeerMessageOps.opcodeToOperation(msgIn.getOpcode()));
if (msgIn.getOpcode() == PeerMessageOps.OPCODE_REQUEST_PEER_FILES) {
PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_PEER_FILE);
msgOut.setLast(true);
msgOut.setFileSize(62);
msgOut.setFileHash("abcdefghijklmnoprqstuvwxyzaaaaaaaaaaaaaa");
msgOut.setFilenameLong((byte) 10);
msgOut.setFilenameVal("prueba.txt");
msgOut.writeMessageToOutputStream(dos);
System.out.println("sent " + PeerMessageOps.opcodeToOperation(msgOut.getOpcode()));
}
} catch (IOException e) { } catch (IOException e) {
// ??????? // ???????
} }
@@ -183,14 +202,37 @@ public class NFServer implements Runnable {
InetSocketAddress clientAddr = (InetSocketAddress) socket.getRemoteSocketAddress(); InetSocketAddress clientAddr = (InetSocketAddress) socket.getRemoteSocketAddress();
try { try {
while(true) {
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream()); DataInputStream dis = new DataInputStream(socket.getInputStream());
while(true) {
PeerMessage msgIn = PeerMessage.readMessageFromInputStream(dis);
switch (msgIn.getOpcode()) {
case PeerMessageOps.OPCODE_REQUEST_PEER_FILES:
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];
msgOut.setFileHash(archivo.fileHash);
msgOut.setFileSize(archivo.fileSize);
msgOut.setFilenameVal(archivo.fileName);
msgOut.setFilenameLong((byte)archivo.fileName.length());
msgOut.setLast(false);
if (i == archivos.length - 1) msgOut.setLast(true);
msgOut.writeMessageToOutputStream(dos);
}
}
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@@ -289,7 +289,15 @@ public class DirectoryConnector {
* de la operación * de la operación
*/ */
DirMessage serve = new DirMessage(DirMessageOps.OPERATION_SERVE, NanoFiles.peerNickname, this.directoryHostname, serverPort); // este trozo hay que cambiarlo porque qué cojones
String ip = null;
try {
socket.connect(directoryAddress);
ip = socket.getLocalAddress().getHostAddress();
socket.disconnect();
} catch(Exception e) {}
DirMessage serve = new DirMessage(DirMessageOps.OPERATION_SERVE, NanoFiles.peerNickname, ip, serverPort);
byte[] serveBytes = serve.toString().getBytes(); byte[] serveBytes = serve.toString().getBytes();
byte[] response = sendAndReceiveDatagrams(serveBytes); byte[] response = sendAndReceiveDatagrams(serveBytes);
String respStr = new String(response, 0, response.length); String respStr = new String(response, 0, response.length);

View File

@@ -193,19 +193,16 @@ public class DirMessage {
} }
case FIELDNAME_NICK: { case FIELDNAME_NICK: {
System.out.println("nick");
m.setNick(value); m.setNick(value);
break; break;
} }
case FIELDNAME_IP: { case FIELDNAME_IP: {
System.out.println("ip");
m.setIP(value); m.setIP(value);
break; break;
} }
case FIELDNAME_PORT: { case FIELDNAME_PORT: {
System.out.println("port " + Integer.parseInt(value));
m.setPort(Integer.parseInt(value)); m.setPort(Integer.parseInt(value));
break; break;
} }
@@ -225,14 +222,16 @@ public class DirMessage {
} }
case FIELDNAME_PEERS: { case FIELDNAME_PEERS: {
System.out.println("Hemos entrado a FIELDNAME_PEERS");
Map<String, InetSocketAddress> peersList = new LinkedHashMap<>(); Map<String, InetSocketAddress> peersList = new LinkedHashMap<>();
String[] peers = value.split(","); String[] peers = value.split(",");
for (String p: peers) { if (peers[0].isBlank()) {
String[] partes = p.split(":"); m.setPeers(peersList);
peersList.put(partes[0], new InetSocketAddress(partes[1], Integer.parseInt(partes[2]))); break;
System.out.println("DirMessage - partes[0]: " + partes[0]);
} }
for (String p: peers) {
System.out.println("p: " + p);
String[] partes = p.split(":");
peersList.put(partes[0], new InetSocketAddress(partes[1], Integer.parseInt(partes[2]))); }
m.setPeers(peersList); m.setPeers(peersList);
break; break;

View File

@@ -255,7 +255,6 @@ public class NFDirectoryServer {
case DirMessageOps.OPERATION_SERVE: { case DirMessageOps.OPERATION_SERVE: {
if (registeredPeers.put(receivedMsg.getNick(), new InetSocketAddress(receivedMsg.getIP(), receivedMsg.getPort())) == null) { if (registeredPeers.put(receivedMsg.getNick(), new InetSocketAddress(receivedMsg.getIP(), receivedMsg.getPort())) == null) {
System.out.println("NFDS - añadido peer");
msgToSend = new DirMessage(DirMessageOps.OPERATION_SERVE_OK); msgToSend = new DirMessage(DirMessageOps.OPERATION_SERVE_OK);
} else { } else {
msgToSend = new DirMessage(DirMessageOps.OPERATION_SERVE_ERROR); msgToSend = new DirMessage(DirMessageOps.OPERATION_SERVE_ERROR);