web-dev-qa-db-fra.com

Comment vérifier si un socket est actuellement connecté en Java?

J'essaie de savoir si un Java TCP Socket est actuellement connecté, ce qui suit semble juste me dire si le socket a été connecté à un moment donné - pas si elle est actuellement encore connectée.

socket.isConnected();

Toute aide appréciée, merci.

25
Supertux
  • socket.isConnected() retourne toujours vrai une fois que le client se connecte (et même après la déconnexion) bizarre !!
  • socket.getInputStream().read()
    • oblige le thread à attendre l'entrée tant que le client est connecté et oblige donc votre programme à ne rien faire - sauf si vous obtenez une entrée
    • returns -1 Si le client s'est déconnecté
  • socket.getInetAddress().isReachable(int timeout): De isReachable (int timeout)

    Testez si cette adresse est accessible. Le meilleur effort est fait par l'implémentation pour essayer d'atteindre l'hôte, mais les pare-feu et la configuration du serveur peuvent bloquer les demandes résultant en un état inaccessible tandis que certains ports spécifiques peuvent être accessibles. Une implémentation typique utilisera ICMP ECHO REQUESTs si le privilège peut être obtenu, sinon elle tentera d'établir une connexion TCP sur le port 7 (Echo) de l'hôte de destination.

19
Sumit Singh

En supposant que vous ayez un certain niveau de contrôle sur le protocole, je suis un grand fan de l'envoi de pulsations pour vérifier qu'une connexion est active. Il s'est avéré être la méthode la plus fiable et vous donnera souvent la notification la plus rapide lorsqu'une connexion est rompue.

TCP Keepalives fonctionnera, mais que faire si l'hôte distant est soudainement mis hors tension? TCP peut prendre un certain temps à expirer. D'un autre côté, si vous avez une logique dans votre application qui attend une réponse de pulsation toutes les x secondes, la première fois que vous ne les obtenez pas, vous savez la connexion ne fonctionne plus, que ce soit par un problème de réseau ou de serveur sur le côté distant.

Voir Dois-je battre mon cœur pour garder une TCP ouverte? pour plus de discussion.

16
Jason Nichols