Salut,
Je développe un serveur en java pour recevoir les requêtes à partir des clients qui viennent de se connecter. J'ai la boucle suivante pour traiter la session établie avec un client:
code:
byte[] buf = new byte[2048];
while (socket != null && socket.isConnected()){
socket.getInputStream().read(buf);
/* traitement de buf */
}
Le problème est que lorsque le client interrompe la connexion de façon incorrect (déconnexion sans utiliser la méthode "socket.close()"), alors la boucle while du serveur commence à tourner sans limite (puisque pour lui socket est non null et est encore connectée), et bien sûr, buf sera vide à chaque fois.
J'ai pas trouver aucune méthode capable de détecter l'absence non signalé du client alors j'ai ajouté une condition de vérification de la taille de "buf" qui permet de sortir de la boucle while si sa taille est 0, mais je trouve que cette solution n'est pas propre, et je voudrais savoir si quelqu'un d'entre vous est capable de m'aider à ce sujet.
Merci de ta réponse.
J'ai déjà essayé cette méthode ainsi que la méthode isInputShutdown() mais leurs valeurs sont toujours "true" pour isBound() et "false" pour "isInputShutdown()" même quand le client disparaît.
Je crois qu'il n'y a pas vraiment de méthode
Si votre client envoie des données en continu, vous pouvez appliquer un timeout a votre socket qui se fermera d'elle même si aucun message n'est reçu dans le délai indiqué. Vous pouvez même modifier votre client pour qu'il envoi des petits messages pour garder la connexion active.
J'ai fait une condition sur la taille du message reçu : si la taille est positive alors on reste à l'écoute des conneries du client, sinon (taille = -1) il faut conclure que le client n'est plus existant!!! ça a marché, mais je cherche une façon plus propre!! De toute façon je ne sais pas pourquoi le statu de Socket reste "connecté" même si le client ne répond pas! Est ce que c'est une mauvaise classe développée par SUN? (je rigole bien sûre)