2009-09-30 5 views
7

J'ai écrit un serveur exécutant des opérations d'E/S non bloquantes à l'aide de l'API Java NIO. Je vois une situation dans laquelle une application cliente s'arrête soudainement (par exemple en raison d'une perte de puissance) et la connexion est laissée ouverte du côté serveur. Un collègue a rencontré le même problème et a dit qu'il utilise les battements de coeur sur la ligne pour détecter ce genre de chose, mais j'espère qu'il y a un moyen plus facile. Quelqu'un d'autre a-t-il rencontré ce problème? Quelques informations supplémentaires: Ma conception de serveur actuelle annulera une clé et fermera la voie correspondante si elle saisit IOException lors d'une tentative de lecture/écriture. Cette approche semble fonctionner 99% du temps; J'ai seulement vu une poignée de situations où la connexion semble être laissée ouverte.NIO - Détection d'une connexion fermée

Répondre

6

Sans les battements cardiaques au niveau de l'application, votre seule option est de compter sur TCP keepalive. Mais l'intervalle par défaut est très long (comme 2 heures). Le RFC ne recommande pas un intervalle inférieur à 2 heures.

Vous pouvez le raccourcir mais il s'agit de paramètres à l'échelle du système. Sur certains OS, il faut même reconstruire le noyau pour changer cela. Par conséquent, un battement de cœur est fortement recommandé pour tout protocole basé sur TCP.

+0

Merci Codeur ZZ - C'est ce que je pensais (craint). Je suis assez étonné que ce ne soit pas une caractéristique de TCP. – Adamski

+0

Un "ping" plutôt, ces applications ne sont pas humaines - vous savez. –

Questions connexes