Java SocketChannel n'est pas détecter la déconnexion?
J'ai un socket en cours d'exécution, à l'aide de sélecteurs. Je suis en train de vérifier pour voir si mon socket est connecté au serveur ou pas.
Boolean connected = _channel.isConnected();
et il retourne toujours true. J'ai éteint l'Aéroport (connexion internet) sur mon ordinateur, et quand je vérifie pour voir si le socket est connecté ou pas, il renvoie la valeur true.
Aucune idée pourquoi?
J'essaie d'écrire des données sur le serveur toutes les 3 secondes, et cela ne change pas l'état de ma prise de déconnecté.
- Je suis un peu perdu, quelqu'un ne cesse de changer le titre de mes questions. Ce qui se passe ici?
- Avec le code ci-dessus pour vérifier si la SocketChannel est toujours connecté. Qu'est-ce exactement avez-vous fait les tests, le support, comme indiqué dans la question ou la chaîne comme décrit dans le titre et indiqué dans le code? Juste demander, parce que les gens ont commencé à downvoting ma réponse... (sans expliquer pourquoi...)
- 1 - fermer manuellement le socket, en appelant la méthode, c'est pourquoi vous obtenez faux après avoir déconnecté du serveur, dans mon cas, je suis en train d'essayer de détecter si il y a une déconnexion de la question, par exemple "perte de connexion", de sorte que la douille ne les détecte pas qu'il est déconnecté, à moins que j'essaie d'envoyer un message au serveur et obtenir une exception. 2 - j'ai également dit que je suis l'aide d'un sélecteur. donc isConnected méthode ne démontrent pas si je suis connecté au serveur ou pas, mais cela montre que, si mon socket est toujours connecté à le sélecteur ou non, qui renvoie vrai que mon socket est connecté à l'sélecteur
Vous devez vous connecter pour publier un commentaire.
Habituellement, si vous désactivez le niveau de l'OS, réseau, écrit à socket devrait lancer des exceptions, de sorte que vous savez que la connexion est interrompue.
Cependant de manière plus générale, nous cann pas être sûr si un paquet est livré. En java (probablement C trop), il n'y a aucun moyen de vérifier si un paquet est accusé de réception ed.
Même si nous pouvons vérifier les accusés de réception TCP, cela ne garantit pas que le serveur a reçu ou traitées le paquet. Cela signifie seulement que la machine cible reçu le paquet et mis en mémoire tampon en mémoire. Beaucoup de choses peuvent mal se passer après.
Donc, si vous voulez vraiment sûr, vous ne pouvez pas compter sur le protocole de transport. Vous devez avoir niveau de l'application ACK, qui est, l'application serveur renvoie un accusé de réception de message après avoir reçu et traité un message à partir d'un client.
De vue client, il envoie un message au serveur, puis essaie de lire accusé de réception à partir du serveur. Si il l'obtient, il peut être certain que son message est reçu et traitées. Si elle ne parvient pas à obtenir de l'accusé de réception, eh bien, il n'a aucune idée de ce qui s'est passé. Empiriquement, le plus probable TCP échoué. Prochaine possibilité est que le serveur s'est écrasé. Il est également possible que tout est OK, sauf l'accusé de réception ne pouvait pas atteindre le client.
Le canal n'est pas fermé lorsque le serveur n'est plus disponible en raison d'une fracture de la connexion physique ou une panne de serveur. Pour une fois qu'une connexion a été établie,
isConnected()
sera de retourtrue
jusqu'à la fermeture de la chaîne sur votre côté.Si vous voulez vérifier, si le serveur est toujours disponible, envoyer un octet à la sockets outputstream. Si vous obtenez une Exception, alors que le serveur est indisponible (perte de connexion).
Modifier
pour EJP - code d'essai et de reconsidérer votre commentaire et réponse:
Sortie sur ma machine est
isConnected() == false
.isConnected() permet de savoir si vous avez connecté le canal objet, que vous avez, et il n'est pas spécifié renvoie false lorsque vous le fermez, même si apparemment il n': voir Andreas réponse. Il n'est pas là pour vous dire si le sous-jacent connexion est toujours là. Vous ne pouvez dire qu'en l'utilisant: -1 à partir d'une lecture ou d'une exception, vous dit qu'.
isConnected()
retournefalse
sur ma machine quand je ferme le canal vers le serveur distant. Voir ma réponse pour un exemple.-1
de lecture ne fonctionne pas trop. J'ai ajouté une lecture et il s'est bloqué (en attente d'octets). Puis j'ai tiré le câble réseau et l'application gardé de blocage (pas de-1
comme un résultat).