implementado quit, hay que cerrar los sockets TCP cuando terminen las cosas

This commit is contained in:
binlaab
2026-04-27 23:58:44 +02:00
parent 4e60e66926
commit c480c4a831
8 changed files with 50 additions and 16 deletions

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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;
@@ -43,6 +44,17 @@ public class NFServer implements Runnable {
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
* de atender una conexión de un cliente. Una vez se lanza, ya no es posible
@@ -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
@@ -174,6 +186,7 @@ public class NFServer implements Runnable {
/**
* Método de clase que implementa el extremo del servidor del protocolo de
* transferencia de ficheros entre pares.

View File

@@ -18,7 +18,6 @@ public class NFServerState {
}
public List<Socket> getSockets() {
// tu puta madre va a hacer copias
return sockets;
}

View File

@@ -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,8 +400,12 @@ 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;

View File

@@ -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);

View File

@@ -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

View File

@@ -268,6 +268,17 @@ public class NFDirectoryServer {
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 + "\"");
System.exit(-1);