Perdón por la pregunta novata, pero estoy creando una aplicación cliente-servidor.

Si creo la conexión del cliente al servidor dentro de un método en la clase principal, ¿esa conexión permanecería abierta después de que el método se haya ejecutado?

Hasta ahora tengo una GUI que pide el nombre de host que luego llama al método Connect. Después de que el método ha regresado y el programa continúa ejecutándose, ¿permanece abierta la conexión dentro del método?

public static void main(String[] args) {
    ConnectionGUI connect = new ConnectionGUI();
}
public boolean Connect(String hName) {
    Socket clientSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;
    try {
        clientSocket = new Socket(hName, 16000);
        out = new PrintWriter (clientSocket.getOutputStream(), true);
        in = new BufferedReader (new InputStreamReader(clientSocket.getInputStream()));
        return true;
    } catch(Exception e) {
        return false;
    }
}
1
Thor 20 oct. 2017 a las 15:12

3 respuestas

La mejor respuesta

¿La conexión permanecería abierta?

Sí, lo haría, no hay llamada para cerrar, así que hasta que el programa se detenga, el socket se dejará abierto.

¿Cómo evito esta pérdida de recursos?

Utiliza try-with-resources para crear un bloque que tenga acceso a un recurso AutoCloseable y que lo cierre automáticamente una vez que se deja el bloque, incluso si se lanza un Throwable.

1
jrtapsell 20 oct. 2017 a las 12:28

Sería mejor asegurarse de que el Socket se está cerrando.

Puede hacer esto agregando un bloque finalmente:

 finally {
        clientSocket.close();
 }

O, en su lugar, utiliza el método de prueba

try(Socket clientSocket = new Socket(hName, 16000)) {
        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        return true;
    }catch(Exception e){
        return false;
    }
1
dillius 20 oct. 2017 a las 12:20

Si lo hace Los objetos que llaman a los métodos como comportamientos todavía dejan elementos del método que usan. Java es seguro para la memoria, por lo que cuando su objeto ya no esté en uso, y los métodos del objeto hayan abierto, por ejemplo, una conexión, la conexión permanecerá abierta, pero el objeto se eliminará ... esto se debe a la Basura Coleccionista en java.

Solución:

Anule el método de finalización en la superclase universal (java.lang.Object) con su propio finalize (), que cerrará la conexión cuando el objeto ya no esté en uso. El recolector de basura llamará a su método de finalización cuando vaya a eliminar su objeto, y cerrará la conexión.

0
Brenann 20 oct. 2017 a las 16:53