Maison >Java >javaDidacticiel >Comment puis-je détecter de manière fiable les fermetures de connexion WebSocket à l'aide de l'API Socket de Java ?

Comment puis-je détecter de manière fiable les fermetures de connexion WebSocket à l'aide de l'API Socket de Java ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-18 17:43:14704parcourir

How Can I Reliably Detect WebSocket Connection Closures Using Java's Socket API?

API Java Socket : détection des fermetures de WebSocket

Dans l'API Socket de Java, déterminer si une connexion a été fermée peut être difficile. La méthode isConnected() renvoie true même pour les sockets déconnectés à distance, tandis que isClosed() reste false malgré les fermetures à distance.

Approche conventionnelle

De nombreux développeurs ont recours à l'écriture continue de déchets. messages au flux de sortie et vérification des exceptions pour détecter les fermetures. Cependant, cette méthode est inefficace et pollue le réseau.

Solutions alternatives

Malheureusement, il n'existe aucune API qui signale explicitement l'état de la connexion. Au lieu de cela, les approches suivantes peuvent être utilisées pour déduire si un socket a été fermé :

  1. Opérations de lecture/écriture : Si l'homologue a correctement fermé la connexion :

    • read() renvoie -1
    • readLine() renvoie null
    • Autre Les méthodes readXXX() lancent EOFException
    • Les écritures aboutissent finalement à une IOException avec le message "connexion réinitialisée par un homologue"
  2. Connection Drop : Si la connexion s'interrompt brusquement :

    • Les écritures entraîneront une IOException comme décrit ci-dessus
  3. Délai d'expiration de lecture : Si le homologue est toujours connecté mais inactif :

    • Utilisez un délai d'expiration de lecture pour détecter un manque de communication
  4. Gestion des chaînes : Contrairement à la croyance populaire, ClosedChannelException n'indique pas une connexion fermée, mais plutôt un canal fermé après utilisation.
  5. Sélectionner la validité de la clé : Dans Java 7 sur Windows XP, une clé sélectionnée qui devient invalide malgré une valeur select() non nulle, cela peut indiquer une réinitialisation de connexion initiée par un homologue.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn