web-dev-qa-db-fra.com

Que signifie exactement une exception de "tuyau cassé" pour le socket?

J'ai une application Android qui parle à un programme sur un PC. J'utilise la classe Socket Android (Java)). Si j'arrête et redémarre le Application PC la prochaine fois que j'envoie quelque chose de Android J'obtiens un IO Exception "Broken Pipe". Ma question n'est pas à ce sujet. Voici la question:

Après avoir obtenu l'exception de canal cassé si je demande la méthode isClosed () du socket, elle retourne false (c'est-à-dire qu'elle n'est pas fermée), et si je demande la méthode isConnected () du socket il renvoie vrai, c'est-à-dire qu'il IS connecté. Quelqu'un pourrait-il s'il vous plaît m'expliquer ces résultats? Merci d'avance!

30
user316117

Un tuyau cassé signifie à peu près exactement ce dont vous parlez ici. Le programme de votre côté a toujours sa prise grande ouverte, mais la prise de l'autre côté n'est plus en communication et n'a pas suivi la procédure standard de "fermeture du tuyau". Cela peut se produire si l'autre côté a soudainement perdu le pouvoir, si la ligne physique a été coupée, ou autre chose. En tant que tel, localement, la prise est enregistrée comme ouverte et connectée - elle est simplement connectée à un tuyau cassé. Souhaitez-vous ici quelques conseils pratiques, ou juste la théorie?

21
Ben Barden

Socket.isClosed() et Socket.isConnected() ne vous disent que ce que vous avez fait au socket. Ils ne sont pas là pour vous dire quoi que ce soit l'état de la connexion. Vous n'avez pas fermé le socket: il est ouvert. Vous avez connecté la prise: elle est connectée.

Lorsque vous obtenez un IOException exploitant un Socket autre que SocketTimeoutException, vous devez fermer le socket.

2
user207421