Bug con Socket y ServerSocket

Lo que suce es que encontre creo un bug en la maquina virtual de java .

Detalles. Tengo un servidor usando ServerSocket, y atiende peticiones de clientes, cada cliente que se conecta es un nuevo Thread. Y lo atiene la clase AtienteSocket que se queda a la espera de comandos, pero se supone que cuando hay un error de entrada /salida debe surgir un error, pero este no lo refleja sino se queda bloqueado :O. ESPERANDO COMANDOS, los pido con un DataInputStream. in.readUTF();

Como provocar ese bug. Ejecutando el cliente en una PC y el server en otro PC. CUando haya hecho la conexion desconecten el cable de red del cliente y veran que no surge ningun error, sino que el sockets refleja como si aun estuviera conectado :O. Tambien surge cuando la PC se queda sin internet repentinamente.

Aqui las clases de trabajo

 

 

 

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

normal

Ese es el comportamiento normal de los sockets. Si lo programas en C o en C# o en ObjC o en lo que sea va a pasar lo mismo.

:S

Entonces sel servidor se quedaria esperando comandos inifinitamente :S, ya que ni checando si el socket está cerrado funciona.

Que mal. :(

Alguna solución?

Imagen de ezamudio

timeout

Puedes ponerle un timeout a cada socket. Por default no tienen timeout, así que cuando haces una operación de lectura sobre su InputStream y no hay datos, se queda bloqueado indefinidamente. Pero si le pones timeout al socket, cuando haces una lectura y no hay datos, se bloquea máximo por el tiempo que hayas indicado, y en ese momento se arroja SocketTimeoutException. Ahí puedes revisar si el socket sigue conectado o ya no, para volver al ciclo e intentar leer datos otra vez, o cerrar la conexión.

No funciona :S

Aun asi el socket me dice que no ha sido cerrado

soket.isClosed(); Regresa siempre false.

Es raro

Imagen de ezamudio

es que no se ha caído

Desconectar el cable no necesariamente rompe la conexión, así no funciona TCP. Si lo desconectas unos segundos y lo vuelves a conectar a veces se puede restablecer la conexión, la aplicación ni cuenta se da de la desconexión temporal si el sistema operativo no se lo notifica.

XD

Pero el punto es que aveces una computadora cliente se queda sin internet, y no se regleja en el server. Punto menos para java :(

Imagen de ezamudio

prueba C#

corre, ve y prueba C# para que veas que pasa exactamente lo mismo.

Imagen de bferro

Nada tiene que ver con el lenguaje

Como comenta Enrique, nada tiene que ver con el lenguaje. Es el ciclo de vida del socket como abstracción de programación para trabajar a nivel de transporte. La magia no existe si no hay magos, y los magos somos nosotros.