[Résolu] Arrêter un Thread qui attend un paquet sur un DatagramSocket

Arrêter un Thread qui attend un paquet sur un DatagramSocket [Résolu] - Java - Programmation

Marsh Posté le 13-05-2006 à 10:53:02    

Bonjour,
 
Ce problème peut sembler évident mais malgrès mes recherches sur ce forum et sur google je n'ai pas trouvé de solution :
J'utilise le protocole UDP via les DatagramSocket et DatagramPacket pour réaliser un petit jeu en réseau. J'arrive parfaitement à réaliser la communication entre les machines, de ce côté là aucun problème :)
A un moment donné je dois créer un Thread dont le but est de lire sur un socket puis de transmettre cette information. J'ai donc crée une classe qui implémente l'interface Runnable dont voici la méthode run (je ne détaille pas le traitement des données, sock est un DatagramSocket supposé ouvert)

Code :
  1. byte[] tabRecu = new byte[2];
  2. DatagramPacket packRecep = new DatagramPacket(tabRecu, 2);
  3. while(true)
  4. {
  5. try
  6. {
  7.  sock.receive(packRecep);
  8. }
  9. catch(Exception ex)
  10. {
  11.  return;
  12. }
  13. //traitement des données
  14. }


Le problème est que je souhaite arrêter cette tâche proprement sans utiliser la méthode stop() qui est deprecated. J'ai donc pensé à la méthode habituelle comme un booleen à la place de true mais elle ne marche pas ici.
Cette tâche passe la majeure partie de son temps à attendre la réception d'un paquet sur le socket sock donc même si le booleen est mis sur false la tâche ne sera pas stoppée !
Une autre solution serait de fermer le socket mais ce n'est pas possible car je dois le laisser ouvert. J'ai aussi essayé avec la méthode interrupt() de la classe Thread mais elle ne provoque pas d'exception sur la méthode receive (d'après la doc une exception n'est renvoyée que avec un certain type d'opérations IO)
Si quelqu'un a une idée je le remercie d'avance  :)


Message édité par The Mauler le 13-05-2006 à 21:37:15
Reply

Marsh Posté le 13-05-2006 à 10:53:02   

Reply

Marsh Posté le 13-05-2006 à 12:09:20    

si c'est le thread qui instancie la socket, tu est obligé de fermer la socket. C'est logique...  
Mais n'oublie pas que fermer une socket dure un petit temps.

Reply

Marsh Posté le 13-05-2006 à 12:25:03    

Merci pour ta réponse.
Mais en fait ce n'est pas ce Thread qui va instancier le socket. Celui ci est déjà crée.
Concrètement dans le jeu que je dois réaliser je choisi d'abord de me "connecter" (en réalité ce n'est pas vraiment une connexion mais juste l'ouverture des sockets) puis je démarre une partie (qui utilise le Thread du dessus) je dois donc pouvoir arrêter cette tache sans fermer le socket pour faire plusieurs parties d'affillée !

Reply

Marsh Posté le 13-05-2006 à 15:08:24    

Il faut alors que tu mettes un timeout sur le socket, en faisant sock.setSoTimeout(xxx) avant d'entrer dans la boucle. Comme ça, tu ne restes jamais bloquer par la méthode receive() plus de xxx millisecondes.

Reply

Marsh Posté le 13-05-2006 à 16:06:56    

Oui j'avais pensé aussi à cette solution. En fait au départ je pensais que ce moyen n'était pas possible car une fois que ce Thread est fini j'utilise aussi ce socket pour des lectures bloquantes. Mais il suffit tout simplement de rappeler la fonction setSoTimeout() avec comme paramètre 0 ms !
Je vais essayer cette solution :)
Merci ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed