SocketChannel: java.io.IOException: Une connexion existante a dû être fermée par l'hôte distant
Je suis en utilisant un SocketChannel avec un socket réseau, et d'avoir à gérer l'exception prévue à l autre extrémité de la douille de fermeture du canal de façon inattendue.
Le problème est, je reçois ce IOException:
java.io.IOException: An existing connection was forcibly closed by the remote host
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(Unknown Source)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
at sun.nio.ch.IOUtil.read(Unknown Source)
at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
...
J'ai besoin de distinguer entre cette exception, qui est susceptible de se produire, et les exceptions inattendues, de sorte que je peux me connecter/imprimer l'inattendu et la poignée de celui-ci. Mais c'est juste un ordinaire IOException avec un autre message texte, et bien que je vérifie toujours SocketChannel.isOpen() et SocketChannel.isConnected(), ils semblent revenir de vrai dans cette affaire, même si l'autre extrémité de la douille a été fermé.
Ce qui peut/doit-je faire?
Je n'ai pas veux ça arrive, mais ça arrive tout le temps: l'autre extrémité de la prise ferme quand il se sent comme il. Je n'ai pas une bande mécanisme qui dit "OK, au Revoir!" afin que le serveur sait quand s'arrêter de communication, donc, je dois faire face. Et le réseau peut aller vers le bas, et que ce soit. Je veux traiter ce cas comme d'habitude.
OriginalL'auteur Jason S | 2011-04-12
Vous devez vous connecter pour publier un commentaire.
la isOpen() et isConnected() devrait être plus exact d'appeler hasBeenOpenned() et hasBeenConnected(). Une fois qu'ils sont vrais, ils ne reviennent pas pour de faux.
Vous pourriez avoir à faire e.getMessage().contient("fermée par l'hôte distant"). Malheureusement, cela est susceptible d'être une plate-forme de charge.
Au lieu de cela, je vous suggère d'autoriser le protocole pour envoyer un "Fermé" message d'une certaine sorte, et de traiter toute exception sans cette première surprenante.
OriginalL'auteur Peter Lawrey
Cela pourrait être un peu moche... Vous pouvez jouer à la balle avec elle. Double d'essayer le code, la capture de la première exception et de déterminer le message. Si c'est ce que vous attendez, de l'ignorer ou de faire ce que vous alliez faire avant. Si ce n'est pas ce que vous attendre, aller de l'avant et de le jeter à la hausse essayer.
Maintenant que j'y pense, on pourrait faire ça dans un seul essayer si tu voulais, juste en regardant le message.
Cela étant dit, je pense que vous devriez réévaluer l'idée de s'appuyer sur cette exception pour les flux de contrôle du programme. Êtes-vous sûr que vous devez avoir un design qui dit "je suis en manque de cette exception à arriver"?
Oui, je dois l'admettre - je n'aime pas ce code. J'essaie de faire fonctionner par la mentalité de "Si une exception se produit, il y a un bug." Je comprends votre cas. Parfois, nous n'avons pas de temps/financement/politique de faire les choses comme nous le voulons. 🙁
Je ne sais pas pourquoi le Soleil n'a pas de jeter un ClosedChannelException à la place.
Si j'ai à le faire, je vais utiliser ta méthode, sinon Peter a un point qu'il est préférable d'envoyer une sorte de message Fermé; je vais trouver un moyen. argh.
m') -- eh bien, alors ils doivent avoir défini un ConnectionClosedException ou quoi que ce soit.
OriginalL'auteur corsiKa