2009-06-05 27 views
6

Tengo un código de Java que hace una conexión de socket a largo plazo con un dispositivo de automatización doméstica para supervisarla en busca de actividad/eventos. El problema es que si el dispositivo se reinicia o recibe un ciclo de encendido, el código de Java se debe volver a conectar automáticamente tan pronto como sea posible. ¿Alguna idea de cómo detectar una conexión descartada en el lado de Java, de preferencia sin un sondeo periódico del dispositivo?Vuelva a conectar una conexión de socket Java al desconectarse

Respuesta

3

Si el dispositivo se reinicia sin cerrar correctamente el zócalo, no conozco nada que le permita detectarlo. Su servidor no podrá detectar que el socket se ha apagado, en este caso, a menos que el dispositivo vuelva a subir o hasta que la pila TCP/IP en su servidor se rinda y declare que la conexión está muerta. En algún momento obtendrá un IOException.. Debe detectar esa excepción y luego reconectarla cuando ocurra.

Usted está realmente a merced del comportamiento de TCP/IP aquí. Cuando un extremo de una conexión simplemente desaparece (no FIN paquete), el otro extremo puede esperar un período de tiempo arbitrario (dependiendo de muchos factores) antes de decidir que la conexión está muerta.

Si desea detectar este problema antes, y puede garantizar que el dispositivo responderá dentro de un período de tiempo determinado, establezca un tiempo de espera en el socket. Si hace esto, obtendrá un SocketTimeoutException si el dispositivo no responde, y luego puede cerrar el zócalo e intentar reabrir el zócalo. Lo he usado con éxito.

2

Si su software está a la espera de datos del dispositivo domótico, la única forma de detectar que el dispositivo se ha ido es habilitar la opción SO_KEEPALIVE en el socket abierto para comunicarse con el dispositivo.

Para hacer esto simplemente llame al método setKeepAlive (verdadero) en el socket y eso hará que la implementación del socket subyacente habilite la opción SO_KEEP_ALIVE.

Esto hará que la implementación subyacente intercambie periódicamente algunos datos con el punto extremo remoto y si el dispositivo muere mientras espera datos, se lanzará una excepción.

El único problema es que este tiempo de espera activo depende del sistema operativo y, a veces, no se puede cambiar.

Si necesita tiempos de espera más cortos, no hay otro modo que implementar una sonda periódica en el dispositivo.

1

He resuelto este mismo problema.

Si desea detectar este problema antes, y puede garantizar que el dispositivo responderá dentro de un período de tiempo determinado, establezca un tiempo de espera en el socket. Si hace esto, obtendrá una excepción SocketTimeoutException si el dispositivo no responde, y luego puede cerrar el socket y tratar de volver a abrir el socket. Lo he usado con éxito.

Citado desde arriba:

lo reciba para cerrar el socket a continuación, intenta volver a abrirlo, el que se ejecuta el código bien. El único problema es que una vez que cierro un socket I no puedo volver a abrirlo, obtengo la excepción de que el socket está cerrado. Esto ocurre siempre. ¿Cómo cierro un socket y luego lo vuelvo a abrir sin obteniendo esta excepción?

Cuestiones relacionadas