2009-04-07 7 views
0

Les publications liées n'ont pas répondu à ma question.Le serveur se déconnecte en Java

J'ai un serveur qui fait quelque chose comme:

EVERY TWO SECONDS DO: 
if the inputstream is not null { 
    if inputStream.available() is 0 
    { 
      return 
    } 
    print "handling input stream" 
    handleTheInputStream(); 
} 

Même après mon client se déconnecte, le serveur ne reconnaît pas par un IOException. L'autre poste dit que je verrais un personnage de fin de courant. Cependant, ce n'est pas le cas, car après que mon client se soit déconnecté, je ne vois plus jamais «gérer le flux d'entrée», ce qui indique qu'aucune donnée n'est disponible.

Peut-être que quelque chose ne va pas avec la façon dont je comprends actuellement comment cela fonctionne.

Aidez-nous s'il vous plaît.

+0

Je pense que votre pseudo-code est cassé. Si le flux d'entrée est nul alors inputStream.available() lancera un NPE ... –

+0

Merci de le signaler. Censé être "entréestream n'est pas nul ET ..." – jbu

+0

Dans ce cas, je soupçonne que vous avez maintenant mal les branches ... pourquoi voudriez-vous gérer le flux d'entrée si elle est soit nulle ou n'a pas de données ? –

Répondre

3

Ne pas utiliser available() - qui dit si oui ou non il y a actuellement données disponibles, pas si aura être données disponibles à l'avenir. En d'autres termes, c'est le mauvais outil à utiliser pour détecter la déconnexion.

Fondamentalement, vous devez appeler read() (et traiter les données) jusqu'à ce qu'il renvoie -1, à quel point cela signifie que le client s'est déconnecté.

+0

La lecture retourne -1 lorsque le client s'est déconnecté. – andri

+0

Le problème est que je ne veux pas changer le code existant dans le serveur puisque je ne l'ai pas écrit. Je peux le changer, mais j'aimerais savoir qu'il n'y a pas d'autre moyen de le faire avant de demander à changer. Changer nécessiterait beaucoup de tests de régression. – jbu

+0

@andri: Merci, corrigé. –

1

Si vous utilisez des sockets, vous pouvez vérifier les diverses méthodes d'instance de la classe Socket, telles que isClosed() ou isInputShutdown().

Bien sûr, cela suppose que la méthode opérant sur ce flux a accès à l'objet Socket et pas seulement à InputStream.

Questions connexes