2009-09-30 19 views
7

He escrito un servidor que realiza IO sin bloqueo utilizando la API Java NIO. Estoy viendo una situación en la que, de vez en cuando, una aplicación cliente se apaga abruptamente (por ejemplo, debido a una pérdida de energía) y la conexión se deja abierta en el lado del servidor.NIO - Detectando una conexión cerrada

Un colega ha tenido el mismo problema y dijo que utiliza los latidos del corazón para detectar este tipo de cosas, pero espero que haya una manera más fácil. ¿Alquien más se ha encontrado con este problema?

Alguna información adicional: Mi diseño de servidor actual cancelará una tecla y cerrará el canal correspondiente si detecta IOException al intentar una operación de lectura/escritura. Este enfoque parece funcionar el 99% del tiempo; Solo he visto un puñado de situaciones en las que la conexión parece estar abierta.

Respuesta

6

Sin latidos de nivel de aplicación, su única opción es confiar en TCP keepalive. Pero el intervalo predeterminado es muy largo (como 2 horas). El RFC no recomienda un intervalo inferior a 2 horas.

Puede acortarlo, pero se trata de un parámetro para todo el sistema. En algunos sistemas operativos, incluso requiere la reconstrucción del kernel para cambiar esto.

Por lo tanto, un latido del corazón es muy recomendable para cualquier protocolo basado en TCP.

+0

Gracias ZZ Coder - Eso es lo que pensé (temía). Estoy bastante sorprendido de que esta no sea una característica de TCP. – Adamski

+0

Un "ping" más bien, estas aplicaciones no son humanas, ya sabes. –

Cuestiones relacionadas