From 0cf758943ba2619f72259ccc5119c3c33380f84b Mon Sep 17 00:00:00 2001 From: binlab Date: Sat, 25 Apr 2026 14:26:35 +0200 Subject: [PATCH] uwu --- TODO.txt | 76 +++++++++---------- .../nanoFiles/logic/NFControllerLogicP2P.java | 17 ++++- .../nanoFiles/tcp/client/NFConnector.java | 33 +++++++- .../nanoFiles/tcp/message/PeerMessage.java | 5 +- .../tcp/message/PeerMessageTest.java | 39 ++++++++++ .../redes/nanoFiles/tcp/server/NFServer.java | 50 +++++++++++- .../nanoFiles/tcp/server/NFServerState.java | 58 +++++++------- .../udp/client/DirectoryConnector.java | 10 ++- .../nanoFiles/udp/message/DirMessage.java | 15 ++-- .../udp/server/NFDirectoryServer.java | 1 - 10 files changed, 216 insertions(+), 88 deletions(-) create mode 100644 es/um/redes/nanoFiles/tcp/message/PeerMessageTest.java diff --git a/TODO.txt b/TODO.txt index 61ac712..94fbdf9 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,39 +1,39 @@ -práctica 2 - 1. hecho - 2. hecho - 3. hecho - 4. hecho - -práctica 3 - 1. hecho - 2. hecho - 3. hecho - 4. hecho - -práctica 4 - 1. hecho - 2. hecho - - 1. hecho? - 2. hecho - 3. hecho - 4. hecho - 5. hecho - 6. hecho - 7. hecho a medias, faltan todos los comandos - 8. no - - mirar TODOs en DirMessage, DirMessageOps y NFDirectoryServer - -práctica 5 - hecho, revisarlo - mirar TODOs en NFController - -práctica 6 - 1 - 3. hechos - 4- fin. no - -práctica 7 - especialmente el 9, los demás son pruebas - -práctica 8 +práctica 2 + 1. hecho + 2. hecho + 3. hecho + 4. hecho + +práctica 3 + 1. hecho + 2. hecho + 3. hecho + 4. hecho + +práctica 4 + 1. hecho + 2. hecho + + 1. hecho? + 2. hecho + 3. hecho + 4. hecho + 5. hecho + 6. hecho + 7. hecho a medias, faltan todos los comandos + 8. no + + mirar TODOs en DirMessage, DirMessageOps y NFDirectoryServer + +práctica 5 - hecho, revisarlo + mirar TODOs en NFController + +práctica 6 + 1 - 3. hechos + 4- fin. no + +práctica 7 + especialmente el 9, los demás son pruebas + +práctica 8 parcialmente implementados todos los ejercicios \ No newline at end of file diff --git a/es/um/redes/nanoFiles/logic/NFControllerLogicP2P.java b/es/um/redes/nanoFiles/logic/NFControllerLogicP2P.java index d86c3de..105d862 100644 --- a/es/um/redes/nanoFiles/logic/NFControllerLogicP2P.java +++ b/es/um/redes/nanoFiles/logic/NFControllerLogicP2P.java @@ -9,6 +9,7 @@ import es.um.redes.nanoFiles.application.NanoFiles; import es.um.redes.nanoFiles.tcp.server.NFServer; +import es.um.redes.nanoFiles.util.FileInfo; public class NFControllerLogicP2P { // Servidor TCP local para compartir ficheros con otros peers @@ -101,7 +102,7 @@ public class NFControllerLogicP2P { assert (NanoFiles.testModeTCP); /* * (Boletín SocketsTCP) Inicialmente, se creará un NFConnector (cliente TCP) - * para conectarse a un servidor que esté escuchando en la m isma máquina y un + * para conectarse a un servidor que esté escuchando en la misma máquina y un * puerto fijo. Después, se ejecutará el método "test" para comprobar la * comunicación mediante el socket TCP. Posteriormente, se desactivará * "testModeTCP" para implementar la descarga de un fichero desde múltiples @@ -128,7 +129,19 @@ public class NFControllerLogicP2P { */ protected boolean listPeerFiles(InetSocketAddress peerAddr) { 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; diff --git a/es/um/redes/nanoFiles/tcp/client/NFConnector.java b/es/um/redes/nanoFiles/tcp/client/NFConnector.java index 7d31996..d2cfe06 100644 --- a/es/um/redes/nanoFiles/tcp/client/NFConnector.java +++ b/es/um/redes/nanoFiles/tcp/client/NFConnector.java @@ -9,6 +9,7 @@ import java.net.Socket; import java.net.UnknownHostException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.LinkedList; import es.um.redes.nanoFiles.tcp.message.PeerMessage; 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 * 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()); dos = new DataOutputStream(socket.getOutputStream()); @@ -57,11 +60,11 @@ public class NFConnector { System.out.println("received " + intNumber); */ try { - PeerMessage msgOut = new PeerMessage(PeerMessageOps.OPCODE_REQUEST_PEER_FILES); + PeerMessage msgOut = new PeerMessage((byte) 1); msgOut.writeMessageToOutputStream(dos); System.out.println("sent " + PeerMessageOps.opcodeToOperation(msgOut.getOpcode())); 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())); if (msgIn.getOpcode() == PeerMessageOps.OPCODE_PEER_FILE) { System.out.println("file content: "); @@ -76,7 +79,29 @@ public class NFConnector { } - + public FileInfo[] getFileList() { + try { + LinkedList 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() { diff --git a/es/um/redes/nanoFiles/tcp/message/PeerMessage.java b/es/um/redes/nanoFiles/tcp/message/PeerMessage.java index 92f144b..c786e41 100644 --- a/es/um/redes/nanoFiles/tcp/message/PeerMessage.java +++ b/es/um/redes/nanoFiles/tcp/message/PeerMessage.java @@ -107,12 +107,13 @@ public class PeerMessage { * Usar dis.readFully para leer un array de bytes, dis.readInt para leer un * entero, etc. */ - PeerMessage message = new PeerMessage(); byte opcode = dis.readByte(); + PeerMessage message = new PeerMessage(opcode); switch (opcode) { case PeerMessageOps.OPCODE_REQUEST_PEER_FILES: case PeerMessageOps.OPCODE_PEER_FILES_ERROR: break; case PeerMessageOps.OPCODE_PEER_FILE: { + boolean last = false; byte lastVal = dis.readByte(); @@ -134,6 +135,7 @@ public class PeerMessage { message.setFileHash(new String(fileHash)); message.setFilenameLong(filenameLong); message.setFilenameVal(new String(filenameVal)); + break; } @@ -156,6 +158,7 @@ public class PeerMessage { */ dos.writeByte(opcode); + System.out.println(opcode); switch (opcode) { case PeerMessageOps.OPCODE_REQUEST_PEER_FILES: case PeerMessageOps.OPCODE_PEER_FILES_ERROR: break; diff --git a/es/um/redes/nanoFiles/tcp/message/PeerMessageTest.java b/es/um/redes/nanoFiles/tcp/message/PeerMessageTest.java new file mode 100644 index 0000000..e8fcdd6 --- /dev/null +++ b/es/um/redes/nanoFiles/tcp/message/PeerMessageTest.java @@ -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!"); + } + } + +} + + diff --git a/es/um/redes/nanoFiles/tcp/server/NFServer.java b/es/um/redes/nanoFiles/tcp/server/NFServer.java index 3458573..2479f4b 100644 --- a/es/um/redes/nanoFiles/tcp/server/NFServer.java +++ b/es/um/redes/nanoFiles/tcp/server/NFServer.java @@ -7,6 +7,11 @@ 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.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()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); - int intNumber = dis.readInt(); + /* int intNumber = dis.readInt(); System.out.println("received " + intNumber); int newInt = intNumber + 1; 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) { // ??????? } @@ -183,13 +202,36 @@ public class NFServer implements Runnable { InetSocketAddress clientAddr = (InetSocketAddress) socket.getRemoteSocketAddress(); try { + DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); + DataInputStream dis = new DataInputStream(socket.getInputStream()); while(true) { - DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); - DataInputStream dis = new DataInputStream(socket.getInputStream()); + + 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) { e.printStackTrace(); } + } diff --git a/es/um/redes/nanoFiles/tcp/server/NFServerState.java b/es/um/redes/nanoFiles/tcp/server/NFServerState.java index 0104395..dd3e775 100644 --- a/es/um/redes/nanoFiles/tcp/server/NFServerState.java +++ b/es/um/redes/nanoFiles/tcp/server/NFServerState.java @@ -1,29 +1,29 @@ -package es.um.redes.nanoFiles.tcp.server; - -import java.net.Socket; -import java.util.ArrayList; -import java.util.List; - -public class NFServerState { - private int numberOfConnections; - private ArrayList sockets; - - public NFServerState() { - numberOfConnections = 0; - sockets = new ArrayList<>(); - } - - public int getNumberOfConnections() { - return numberOfConnections; - } - - public List getSockets() { - // tu puta madre va a hacer copias - return sockets; - } - - public void updateState(Socket socket) { - sockets.add(socket); - numberOfConnections++; - } -} +package es.um.redes.nanoFiles.tcp.server; + +import java.net.Socket; +import java.util.ArrayList; +import java.util.List; + +public class NFServerState { + private int numberOfConnections; + private ArrayList sockets; + + public NFServerState() { + numberOfConnections = 0; + sockets = new ArrayList<>(); + } + + public int getNumberOfConnections() { + return numberOfConnections; + } + + public List getSockets() { + // tu puta madre va a hacer copias + return sockets; + } + + public void updateState(Socket socket) { + sockets.add(socket); + numberOfConnections++; + } +} diff --git a/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java b/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java index 67ea434..b573f36 100644 --- a/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java +++ b/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java @@ -289,7 +289,15 @@ public class DirectoryConnector { * 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[] response = sendAndReceiveDatagrams(serveBytes); String respStr = new String(response, 0, response.length); diff --git a/es/um/redes/nanoFiles/udp/message/DirMessage.java b/es/um/redes/nanoFiles/udp/message/DirMessage.java index f0a2bc6..427b056 100644 --- a/es/um/redes/nanoFiles/udp/message/DirMessage.java +++ b/es/um/redes/nanoFiles/udp/message/DirMessage.java @@ -193,19 +193,16 @@ public class DirMessage { } case FIELDNAME_NICK: { - System.out.println("nick"); m.setNick(value); break; } case FIELDNAME_IP: { - System.out.println("ip"); m.setIP(value); break; } case FIELDNAME_PORT: { - System.out.println("port " + Integer.parseInt(value)); m.setPort(Integer.parseInt(value)); break; } @@ -225,14 +222,16 @@ public class DirMessage { } case FIELDNAME_PEERS: { - System.out.println("Hemos entrado a FIELDNAME_PEERS"); Map peersList = new LinkedHashMap<>(); String[] peers = value.split(","); - for (String p: peers) { - String[] partes = p.split(":"); - peersList.put(partes[0], new InetSocketAddress(partes[1], Integer.parseInt(partes[2]))); - System.out.println("DirMessage - partes[0]: " + partes[0]); + if (peers[0].isBlank()) { + m.setPeers(peersList); + break; } + 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); break; diff --git a/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java b/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java index f7ccc0a..0cbaca5 100644 --- a/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java +++ b/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java @@ -255,7 +255,6 @@ public class NFDirectoryServer { case DirMessageOps.OPERATION_SERVE: { 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); } else { msgToSend = new DirMessage(DirMessageOps.OPERATION_SERVE_ERROR);