Una situacion que se presenta comunmente al utilizar sockets en Java es detectar cuando un cliente (conexion) ya no esta activo. La deteccion de esto puede ser necesario para destruir algun objeto y liberar memoria o para terminar el hilo que utilizaba el servidor para procesar la informacion del cliente, entre otras cosas.
Java no ofrece algun evento o propiedad que indique cuando la conexion del socket haya finalizado de forma anormal. Pero existe una forma de saberlo: a prueba y error.
Para saber si la conexion aun esta activa se prueba que se puedan leer datos del cliente. Al utilizar los metodos read() o readLine() (despues de obtener el InputStream del socket), estos nos regresaran un valor null, -1 o generara un excepcion.
En la linea 23 se leen datos del socket y si el dato que devuelve el metodo readLine() es null, significa que ya no se pudieron leer datos del socket y entonces se muestra un mensaje que la conexion se perdio. En esta parte se podria colocar codigo para destruir objetos, liberar memoria, cerrar conexiones a bases de datos, etc. En caso de que se hayan leido datos, simplemente se muestran en pantalla.
El metodo readLine() va a regresar datos hasta que en la entrada se detecte el caracter de salto de linea (\n), retorno de carro (\r) o la combinacion retorno de carro + salto de linea (\r\n).