Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2948 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1365571
The Mauler
Posté le 13-05-2006 à 10:53:02  profilanswer
 

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
mood
Publicité
Posté le 13-05-2006 à 10:53:02  profilanswer
 

n°1365587
moi23372
Posté le 13-05-2006 à 12:09:20  profilanswer
 

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.

n°1365593
The Mauler
Posté le 13-05-2006 à 12:25:03  profilanswer
 

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 !

n°1365635
post_it
Hmmmm!...
Posté le 13-05-2006 à 15:08:24  profilanswer
 

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.

n°1365644
The Mauler
Posté le 13-05-2006 à 16:06:56  profilanswer
 

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 ;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[Résolu] Problème Programmation MFC[JSP/DB2] Problème avec une requête d'insertion - Résolu
[Résolu] [JAVA - RMI] Unsupported major.minor version 49.0[Perl] telnet connexion!! (resolu)
[Résolu] Lier un TextBox à un DataSet dans un TabControl[Résolu] Obtenir date depuis date initiale
[JAVA] Pb de connexion DB Oracle à partir d'une applet [Résolu]Question basique sur les liens ! [résolu]
[Résolu][Oracle Text] chargement de fichiers / index[Résolu] Passer une variable dans une requete SQL
Plus de sujets relatifs à : [Résolu] Arrêter un Thread qui attend un paquet sur un DatagramSocket


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR