From c480c4a83109de15f5f252fccb7c9aaf1a94be64 Mon Sep 17 00:00:00 2001 From: binlaab Date: Mon, 27 Apr 2026 23:58:44 +0200 Subject: [PATCH] implementado quit, hay que cerrar los sockets TCP cuando terminen las cosas --- es/um/redes/nanoFiles/application/NanoFiles.java | 3 ++- .../nanoFiles/logic/NFControllerLogicP2P.java | 11 ++++++----- es/um/redes/nanoFiles/tcp/server/NFServer.java | 15 ++++++++++++++- .../redes/nanoFiles/tcp/server/NFServerState.java | 1 - .../nanoFiles/udp/client/DirectoryConnector.java | 15 +++++++-------- es/um/redes/nanoFiles/udp/message/DirMessage.java | 6 ++++++ .../nanoFiles/udp/message/DirMessageOps.java | 4 ++++ .../nanoFiles/udp/server/NFDirectoryServer.java | 11 +++++++++++ 8 files changed, 50 insertions(+), 16 deletions(-) diff --git a/es/um/redes/nanoFiles/application/NanoFiles.java b/es/um/redes/nanoFiles/application/NanoFiles.java index af23276..46d6b1d 100644 --- a/es/um/redes/nanoFiles/application/NanoFiles.java +++ b/es/um/redes/nanoFiles/application/NanoFiles.java @@ -12,7 +12,7 @@ public class NanoFiles { * que combine los DNIs de ambos miembros del grupo de prácticas. */ public static final String PROTOCOL_ID = "123456789A"; - private static final String DEFAULT_DIRECTORY_HOSTNAME = "192.168.126.1"; + private static final String DEFAULT_DIRECTORY_HOSTNAME = "192.168.1.46"; public static String sharedDirname = DEFAULT_SHARED_DIRNAME; public static FileDatabase db; /** @@ -54,6 +54,7 @@ public class NanoFiles { controller.processCommand(); } while (controller.shouldQuit() == false); System.out.println("Bye."); + System.exit(0); } } diff --git a/es/um/redes/nanoFiles/logic/NFControllerLogicP2P.java b/es/um/redes/nanoFiles/logic/NFControllerLogicP2P.java index dfe207b..17148af 100644 --- a/es/um/redes/nanoFiles/logic/NFControllerLogicP2P.java +++ b/es/um/redes/nanoFiles/logic/NFControllerLogicP2P.java @@ -285,15 +285,16 @@ public class NFControllerLogicP2P { /* * TODO: Enviar señal para detener nuestro servidor de ficheros en segundo plano */ - - - + if (fileServer != null) { + fileServer.stopServer(); + fileServer = null; + } } protected boolean serving() { boolean result = false; - - + + if (fileServer != null) result = true; return result; diff --git a/es/um/redes/nanoFiles/tcp/server/NFServer.java b/es/um/redes/nanoFiles/tcp/server/NFServer.java index 9f23824..3dd8e20 100644 --- a/es/um/redes/nanoFiles/tcp/server/NFServer.java +++ b/es/um/redes/nanoFiles/tcp/server/NFServer.java @@ -24,6 +24,7 @@ public class NFServer implements Runnable { private NFServerState state = new NFServerState(); private ServerSocket serverSocket = null; + private volatile boolean stopServer = false; // gracias pcd public ServerSocket getServerSocket() { return serverSocket; @@ -42,6 +43,17 @@ public class NFServer implements Runnable { serverSocket = new ServerSocket(); serverSocket.bind(serverSocketAddress); } + + public void stopServer() { + // debería cerrar todos los sockets antes de irme + this.stopServer = true; + + try { + if (serverSocket != null && !serverSocket.isBound()) { + serverSocket.close(); + } + } catch (IOException e) { e.printStackTrace(); } + } /** * Método para ejecutar el servidor de ficheros en primer plano. Sólo es capaz @@ -121,7 +133,7 @@ public class NFServer implements Runnable { * @see java.lang.Runnable#run() */ public void run() { - boolean stopServer = false; // HAY QUE CAMBIAR ESTO PORQUE NO SÉ DE DÓNDE COJONES SALE (ver TODO l. 147) + stopServer = false; /* * TODO: (Boletín SocketsTCP) Usar el socket servidor para esperar conexiones de * otros peers que soliciten descargar ficheros @@ -170,6 +182,7 @@ public class NFServer implements Runnable { * servidor en un hilo nuevo que se ejecutará en segundo plano 2) Detener el * servidor (stopserver) 3) Obtener el puerto de escucha del servidor etc. */ + diff --git a/es/um/redes/nanoFiles/tcp/server/NFServerState.java b/es/um/redes/nanoFiles/tcp/server/NFServerState.java index dd3e775..82bef21 100644 --- a/es/um/redes/nanoFiles/tcp/server/NFServerState.java +++ b/es/um/redes/nanoFiles/tcp/server/NFServerState.java @@ -18,7 +18,6 @@ public class NFServerState { } public List getSockets() { - // tu puta madre va a hacer copias return sockets; } diff --git a/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java b/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java index 31c568c..0c5a92a 100644 --- a/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java +++ b/es/um/redes/nanoFiles/udp/client/DirectoryConnector.java @@ -306,11 +306,6 @@ public class DirectoryConnector { String respStr = new String(response, 0, response.length); DirMessage respServe = DirMessage.fromString(respStr); success = respServe.getOperation().equals(DirMessageOps.OPERATION_SERVE_OK); - - if (success) { - - } - return success; } @@ -405,9 +400,13 @@ public class DirectoryConnector { */ public boolean unregisterFileServer() { boolean success = false; - - - + DirMessage unregisterServer = new DirMessage(DirMessageOps.OPERATION_STOP_SERVE, NanoFiles.peerNickname); + byte[] unregisterBytes = unregisterServer.toString().getBytes(); + byte[] response = sendAndReceiveDatagrams(unregisterBytes); + String respStr = new String(response, 0, response.length); + DirMessage respUnregister = DirMessage.fromString(respStr); + success = respUnregister.getOperation().equals(DirMessageOps.OPERATION_STOP_SERVE_OK); + return success; } diff --git a/es/um/redes/nanoFiles/udp/message/DirMessage.java b/es/um/redes/nanoFiles/udp/message/DirMessage.java index 2516f0a..7a70ffc 100644 --- a/es/um/redes/nanoFiles/udp/message/DirMessage.java +++ b/es/um/redes/nanoFiles/udp/message/DirMessage.java @@ -75,6 +75,11 @@ public class DirMessage { } + public DirMessage(String op, String nick) { + this(op); + this.nick = nick; + } + public DirMessage(String op, FileInfo[] filelist) { this(op); this.fileList = filelist; @@ -275,6 +280,7 @@ public class DirMessage { break; case DirMessageOps.OPERATION_SERVE: + case DirMessageOps.OPERATION_STOP_SERVE: sb.append(FIELDNAME_NICK + DELIMITER + this.nick + END_LINE); sb.append(FIELDNAME_IP + DELIMITER + this.ip + END_LINE); sb.append(FIELDNAME_PORT + DELIMITER + this.port + END_LINE); diff --git a/es/um/redes/nanoFiles/udp/message/DirMessageOps.java b/es/um/redes/nanoFiles/udp/message/DirMessageOps.java index d96707c..d289f13 100644 --- a/es/um/redes/nanoFiles/udp/message/DirMessageOps.java +++ b/es/um/redes/nanoFiles/udp/message/DirMessageOps.java @@ -22,6 +22,10 @@ public class DirMessageOps { public static final String OPERATION_REQUEST_SERVER_PEERS = "peers"; public static final String OPERATION_SERVER_PEERS = "serverPeers"; + + 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"; // TODO: definir las operaciones del protocolo de directorio diff --git a/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java b/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java index 25521b9..f7dd1fe 100644 --- a/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java +++ b/es/um/redes/nanoFiles/udp/server/NFDirectoryServer.java @@ -267,6 +267,17 @@ public class NFDirectoryServer { msgToSend.setPeers(registeredPeers); break; } + + case DirMessageOps.OPERATION_STOP_SERVE: { + System.out.println("stop_serve - tenemos el nick " + receivedMsg.getNick()); + if (registeredPeers.get(receivedMsg.getNick()) != null) { + registeredPeers.remove(receivedMsg.getNick()); + msgToSend = new DirMessage(DirMessageOps.OPERATION_STOP_SERVE_OK); + } else { + msgToSend = new DirMessage(DirMessageOps.OPERATION_STOP_SERVE_ERROR); + } + break; + } default: System.err.println("Unexpected message operation: \"" + operation + "\"");