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
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.
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.
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?
- 1. ¿Socket.io vuelve a conectar al desconectarse?
- 2. Cómo desconectarse de socket TCP en nodejs
- 3. Vuelva a conectar automáticamente una conexión de la red Haskell de una manera idiomática
- 4. Conectar al sistema remoto a través del socket
- 5. Bloques de socket Java en la conexión a un servidor
- 6. QPID - Primavera CachingConnectionFactory - Vuelva a conectar
- 7. Forma ideal de configurar una conexión JMS para que se vuelva a conectar automáticamente
- 8. ¿Conectar a socket en Tomcat?
- 9. conectar en "conexión menos" boost :: asio :: ip :: udp :: socket
- 10. Vuelva a conectar el proyecto Eclipse a SVN con Subclipse
- 11. Interrumpir un socket de conexión
- 12. Cadena de conexión para conectar a .MDF
- 13. ¿Se puede conectar un socket web HTML5 a un socket Java?
- 14. Vuelva a vincular un puerto al socket de datagrama en un IP
- 15. Java ~ Enviar una enumeración a través de una conexión de socket
- 16. Vuelva a intentar una conexión en el tiempo de espera en Java
- 17. Conexión al Socket TCP desde el navegador usando Javascript
- 18. pantalla gnu: vuelva a conectar todas las sesiones previamente separadas
- 19. ¿Cómo burlarse de una conexión Socket saliente?
- 20. C#: ¿Cómo finalizo un socket antes de que Socket.BeginReceive vuelva a llamar?
- 21. HTTP conexión persistente vs conexión de socket TCP
- 22. ¿Cómo volver a conectar la conexión redis?
- 23. utilizando una conexión de socket sin bloqueo en C
- 24. Conectar a un socket bloquea la interfaz de usuario
- 25. ¿Cómo se puede conectar y cerrar un socket?
- 26. Vuelva a compilar una clase Java desde Jar
- 27. No se puede conectar al servidor MySQL local a través de socket
- 28. Tiempo de espera de conexión de socket Python
- 29. conexión rechazada: conectar al analizar XML con maravilloso
- 30. Conexión de socket sin bloqueo a través de SSL?