es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué se muestra el error ‘java.net.SocketException: Socket cerrado’ después de ‘java.net.ConnectException: Conexión rechazada’?

Estoy intentando conectarme a un host remoto intentando una y otra vez esperando a que se levante. Sin embargo, después de un intento con una excepción de conexión rechazada (porque el servidor aún no se está ejecutando), arroja continuamente una excepción de socket cerrado. ¿Por qué se cerraría el socket? El socket debería estar simplemente en el mismo estado que estaba antes de la llamada fallida a connect(), ¿no es así?

                while(!tcpSock.isConnected()) {
                    try {
                        tcpSock.connect(destination);
                    } catch (SocketException e) {
                        System.err.println(e.toString());
                    }
                }

En resultado:

“`
Configurando modo de cliente TCP conectando al host remoto localhost/127.0.0.1 puerto 4500
java.net.ConnectException: Conexión rechazada: conectar
java.net.SocketException: Socket cerrado
java.net.SocketException: Socket cerrado
java.net.SocketException: Socket cerrado
java.net.SocketException: Socket cerrado
<code>
El comportamiento deseado es
</code>
Configurando modo de cliente TCP conectando al host remoto localhost/127.0.0.1 puerto 4500
java.net.ConnectException: Conexión rechazada: conectar
java.net.ConnectException: Conexión rechazada: conectar
java.net.ConnectException: Conexión rechazada: conectar
java.net.ConnectException: Conexión rechazada: conectar
Conexión establecida a: localhost puerto 4500
““
(Una vez que termine de depurar, comentaré la impresión de la excepción.)

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la cual el socket se cierra después del primer intento fallido de la llamada connect() se debe al hecho de que la clase Socket de Java se comporta de manera diferente dependiendo de la versión que se esté utilizando. En versiones anteriores a Java 7, un Socket se ponía en un estado cerrado después de un intento fallido de connect(). En Java 7 y versiones posteriores, el Socket permanece abierto y se puede utilizar para futuros intentos de conexión.

    En este caso, parece que el código está utilizando una versión anterior de Java donde el Socket se cierra después del primer intento fallido de conexión. Para solucionar este problema, puedes verificar la versión de Java que se está utilizando y actualizar a una versión más nueva que se comporte de manera diferente. Alternativamente, puedes crear un nuevo objeto socket para cada intento de conexión para asegurarte de que no se cierre prematuramente.

Comments are closed.