[JAVA] Applet qui continue à tourner apres la fermeture web.[RESOLU]

Applet qui continue à tourner apres la fermeture web.[RESOLU] [JAVA] - Java - Programmation

Marsh Posté le 08-04-2005 à 08:36:53    

Difficile de synthetiser mon probleme dans un titre, et de choisir la bonne catégorie (html/JS/php ou Java).
 
Voila : Sur mon site web, je lance via un bouton "clikez ici pour jouer" une fenetre style popup qui lance une Applet. Cette Applet ouvre une socket sur l'Aplli serveur. A la fin du jeu, les communictions sont coupées.
Ca fonctionne plutot bien, sauf que si l'utilisateur ferme la fenetre de jeu (la popup) en cours de partie, et bien les communications par Socket sont toujours ouvertes, donc le serveur ne détecte pas que l'utilisateur a quitté la partie. Pour qu'il s'en rende compte, il faut que l'utilisateur ferme le navigateur qui a lancé la popup ! pourtant, l'Applet est lancée dans la popup.
 
Etrange non ?  :heink:  
 
Vous avez des idées pour m'aider à résoudre ca ?


Message édité par tuxbleu le 20-04-2005 à 11:20:32
Reply

Marsh Posté le 08-04-2005 à 08:36:53   

Reply

Marsh Posté le 08-04-2005 à 09:11:10    

tu utilises les threads ou pas ?

Reply

Marsh Posté le 08-04-2005 à 09:33:44    

oui, un pour la communication réseau.

Reply

Marsh Posté le 08-04-2005 à 09:41:24    

bah alors ca vient de là, cherche pas
 
il faut que tu surcharges la méthode destroy() (héritée de Applet) et que tu inclus un truc du genre :

Code :
  1. if (mySocket != null) mySocket.close()


et tant qu'à faire terminer proprement le thread aussi
 
a+

Reply

Marsh Posté le 08-04-2005 à 09:53:33    

Si je comprend bien, quand la fenetre est fermée, la méthode destroy() est appelée.  
 
Donc j'ai qu'a mettre une methode destroy() dans ma classe qui extends Applet, et lui faire fermer les socket, et puis tout ce que je veux d'autre...
Question subsidière : Es-ce que je dois mettre "super.destroy(); " au début de ma méthode destroy ?
ou es-ce inutile car la méthode destroy() de Applet ne fait rien ?

Reply

Marsh Posté le 08-04-2005 à 09:54:39    

désolé pour les questions cons, moi dans cette application, j'ai dévellopé le module réseau, je m'y connais que peu en Applet proprement dis...


Message édité par tuxbleu le 08-04-2005 à 09:54:58
Reply

Marsh Posté le 08-04-2005 à 15:54:11    

tuxbleu a écrit :

Si je comprend bien, quand la fenetre est fermée, la méthode destroy() est appelée.  
 
Donc j'ai qu'a mettre une methode destroy() dans ma classe qui extends Applet, et lui faire fermer les socket, et puis tout ce que je veux d'autre...
Question subsidière : Es-ce que je dois mettre "super.destroy(); " au début de ma méthode destroy ?
ou es-ce inutile car la méthode destroy() de Applet ne fait rien ?


 
voilà tu rajoutes une méthode destroy(), que tu surcharges en fait car elle est héritée de Applet
non pas besoin de "super.destroy()" car destroy() est vide
extrait http://java.sun.com/j2se/1.3/docs/api/index.html :
A subclass of Applet should override this method if it has any operation that it wants to perform before it is destroyed. For example, an applet with threads would use the init method to create the threads and the destroy method to kill them.  
 
The implementation of this method provided by the Applet class does nothing.

 
pour être plus précis, vu que ta com réseau tourne dans un thread, le mieux est d'écrire dans ta classe threadée qui s'occupe de la com réseau (appellons-là ComRes) une méthode close() du genre :

Code :
  1. public class ComRes extends Thread {
  2.   ...
  3.   public void close() {
  4.     if (mySocket != null) mySocket.close();
  5.     this.stop(); // ou this.comActiv = false;
  6.   }
  7.   ...
  8. }


 
et d'appeller cette méthode dans destroy() de ton applet:

Code :
  1. public class MyApplet extends Applet {
  2.   private ComRes com;
  3.   ...
  4.   public void destroy() {
  5.     com.close();
  6.   }
  7.   ...
  8. }


 
ainsi, tu fermes les sockets, ainsi que les threads
 
a+


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 08-04-2005 à 16:47:41    

Ok, c'est bien ce que j'avais compris.
Comme j'ai une méthode dans mon Controleur de dialogue qui s'occupe de tuer mon réseau (et fermer la Socket), je v l'appeler. (En gros elle appele une méthode style la méthode close que t'as écrite).
 
Juste un truc :
stop(), c'est pas deprecated ? c'est ptet pour ca que ta mis : // ou this.comActiv = false;
Pour arreter un Thread, je fais juste un "return ;"
C'est équivalant ?  
Ca fonctionne, je demande juste pour ma culture.
 
merci de tes conseils et réponses ! :jap:

Reply

Marsh Posté le 08-04-2005 à 17:27:12    

oui stop() est deprecated, en gnl mieux vaut lui demander de se terminer proprement avec un truc genre test sur variable booléene (comActiv par exemple)
mais bon avec stop() ca marche.
tant que tu lock pas des fichiers qcques ou autres, peut de risque de planter quoi que ce soit
 
faire un "return ;" c assez brutal aussi (bien que le thread se termine lui proprement), mais il faut sassurer que tas pas de lock sur autre chose (fermer le socket et les flux c pas une mauvaise idée non plus)
 
ton return; est mieux que stop(), car le stop (à moins que ce soit un this.stop()) est appelé d'une autre méthode, donc c bien "bourrin"
avec le return; c'est lui-même qui se termine, ce qui est déjà mieux
 
maintenant je ne suis pas expert en multithreads, je te dis ce que je crois par rapport à mes connaissances de la chose
 
valaxx
a+


Message édité par trevor le 08-04-2005 à 17:28:33

---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 09-04-2005 à 12:01:56    

un avis est toujours bon a prendre.
 
:jap:

Reply

Sujets relatifs:

Leave a Replay

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