multiples - ¿Cómo se maneja la desconexión de socket en Java?
sockets java examples (3)
Oigan todos. Tengo un servidor escrito en Java usando las clases ServerSocket y Socket.
Quiero ser capaz de detectar y manejar desconexiones, y luego volver a conectar un nuevo cliente si es necesario.
¿Cuál es el procedimiento adecuado para detectar desconexiones de clientes, cerrar el socket y luego aceptar nuevos clientes?
Presumiblemente, está leyendo desde el socket, quizás usando un contenedor sobre la secuencia de entrada, como un BufferedReader. En este caso, puede detectar el final de la secuencia cuando la operación de lectura correspondiente devuelve -1 (para llamadas de lectura sin formato ()) o nula (para llamadas de línea de lectura ()).
Ciertas operaciones causarán una SocketException cuando se realice en un socket cerrado, que también deberá tratar de manera adecuada.
La única forma segura de detectar que el otro extremo se ha ido es enviar latidos cardíacos periódicamente y tener el otro extremo para que se agote el tiempo de espera debido a la falta de latido.
¿Soy solo yo, o nadie se ha dado cuenta de que JavaDoc establece un método bajo ServerSocket api , que nos permite obtener un booleano basado en el estado cerrado del serversocket?
puedes simplemente repetir cada pocos segundos para verificar el estado del mismo:
if(!serverSocket.isClosed()){
// whatever you want to do if the serverSocket is connected
}else{
// treat a disconnected serverSocket
}
EDITAR: Al leer nuevamente su pregunta, parece que necesita que el servidor simplemente busque continuamente conexiones y, si el cliente se desconecta, debería ser capaz de volver a detectar cuando el cliente intenta volver a conectarse. ¿No debería ser esa la solución en primer lugar?
Tenga un servidor que esté escuchando, una vez que capte la conexión de un cliente, debe pasarlo a un objeto de hilo de trabajo y ejecutarlo para que funcione de forma asíncrona. Luego, el servidor puede simplemente volver a escuchar nuevas conexiones. Si el cliente se desconecta, el hilo lanzado debe morir y, cuando se vuelve a conectar, se inicia un nuevo hilo para manejar la nueva conexión.
Jenkov proporciona un gran ejemplo de esta implementación.