pb. communication inter-applet.

pb. communication inter-applet. - Java - Programmation

Marsh Posté le 18-05-2004 à 16:01:44    

salut,
 
je me suis mis au java y a pas tres longtemp et je rencontre certain problemes. la plupart j'arrive a les resoudre avec les aide/tutorial/exemple dispo sur le web mais là je sèche sur un nouveau probleme.
j'ai une page web qui comporte 3 applet.
une applet de connection tcp (que je nommerai type A pour faire simple)
et deux petite applet (type B)(qui sont 2 fois le meme .class) qui affiche des informations récupérées par l'applet type A.
 
dans mes applets type B j'ai créé une instance de l'applet typeA.
j'ai créé un tableau de pointeur d'applet type B dans l'applet type A. ce tableau je le remplis en appelant une fonction qui passe comme parametre "this". parametre qui est stocké dans le tableau.
 
dans la fonction init des type B je recupere des parametre de la page web.  
 
mon probleme est que par la suite, a partir de l'applet type B, si j'essai d'acceder aux variables, je vois que tout est melangé (celles de la 1ere typeB on été remplacées par celles de la 2eme type B!!)
 
 
si vous voulez un peu de code (me grondez pas si c'est trop moche et pas optimiser du tout, je suis en pleine experimentation)
j'ai mis juste les fonctions premieres, le reste est inutile vu que ca foire avant ;) )
 
Applet Type B(appelée 2fois sur la page web)

Code :
  1. public class Applet_ComModbus extends Applet//Connection
  2. {
  3.   //definition des constantes:
  4.   final int MAX_VALEUR_LU=10;
  5.   //definition des variable de la classe
  6.   static private boolean isStandalone = false;
  7.   static private Short sCodeFonction;
  8.   static private Short sStartAddresse;
  9.   static private Short sNbVal;
  10.   static private Short sId;
  11.  
  12.   private AppletConnection InstanceAppletConnection;
  13.   static public short StartAddresse = 0x0000; //short equivalent WORD = 16bit
  14.   public short NbVal = 0x0000;
  15.   static public byte CodeFonction = 0x00;
  16.   static public int Id = 65500;
  17.   public boolean DemarrageAppletTermine=false;
  18.   public String temp="";
  19.   public JLabel jLabel_TitreApplet = new JLabel();
  20.   public JTextField[] TabTextField = new JTextField[MAX_VALEUR_LU];
  21.   //Construct the applet
  22.   public Applet_ComModbus()
  23.   {
  24.     System.out.println("Applet_ComModus::Applet_ComModbus()" );
  25.     InstanceAppletConnection=new AppletConnection();
  26.   }
  27.   //Initialize the applet
  28.   public void init()
  29.   {
  30.     System.out.println("Applet_ComModbus::init" ) ;
  31.    
  32.     this.sId= new Short(getParameter("ID" ));
  33.     this.Id= this.sId.intValue();
  34.     System.out.println("Applet_ComModbus::init : Id=" + this.Id);
  35.    
  36.     while(this.InstanceAppletConnection.AppletInitEnCour!=this.Id)
  37.     {
  38.       //try
  39.       //{
  40.         Thread.yield();//Thread.sleep(100);
  41.       //}
  42.       //catch (InterruptedException ex)
  43.       //{
  44.       //}
  45.     }
  46.     //recuperation des parametres de l'applet:
  47.     this.sCodeFonction = new Short(getParameter("CodeFonction" ));
  48.     this.CodeFonction = this.sCodeFonction.byteValue();
  49.     this.sStartAddresse = new Short(getParameter("StartAddresse" ));
  50.     this.StartAddresse = this.sStartAddresse.shortValue();
  51.     this.sNbVal = new Short(getParameter("NbVal" ));
  52.     this.NbVal = this.sNbVal.shortValue();
  53.     if(this.NbVal>MAX_VALEUR_LU)
  54.       this.NbVal=MAX_VALEUR_LU;
  55.    
  56.     System.out.println("Applet_ComModbus::init : AppletInitEnCour=" + this.InstanceAppletConnection.AppletInitEnCour);
  57.     //ajout de l'applet dans le tableau de la classe AppletConnection
  58.     this.InstanceAppletConnection.AjouterApplet(this);
  59.     try
  60.     {
  61.       jbInit();
  62.     }
  63.     catch(Exception e)
  64.     {
  65.       e.printStackTrace();
  66.     }
  67.   }
  68.   public void start()
  69.   {
  70.     System.out.println("Applet_ComModbus : start commence" );
  71.     DemarrageAppletTermine=true;
  72.     System.out.println("Applet_ComModbus : start terminé" );
  73.     this.InstanceAppletConnection.AppletInitEnCour++;
  74.     System.out.println("Applet_ComModbus::start : AppletInitEnCour=" + this.InstanceAppletConnection.AppletInitEnCour);
  75.   }


 
 
et l'applet type A qui creer la connection tcp

Code :
  1. public class AppletConnection extends Applet
  2. {
  3.   //definition des constantes:
  4.   final byte READ_COILS = 0x01;
  5.   final byte READ_DISCRETE_INPUT = 0x02;
  6.   final byte READ_HOLDING_REGISTER = 0x03;
  7.   final byte READ_INPUT_REGISTER = 0x04;
  8.   final int TAILLE_MAX_REQUETE_MODBUS = 200;
  9.   //definition des variable de classe:
  10.   static tcpip InstanceTcpIp = null;//pour la connection TCP
  11.   static int iCountApplet = 0;//nombre d'applet chargé sur la page
  12.   static int AppletInitEnCour=0;//variable d'identification qui permet d'initialiser chaque applet une par une
  13.   static Applet_ComModbus[] tabApplet; //tableau d'objet applet
  14.   boolean bFlagRequeteLibre=true;//flag indiquant que l'on peu envoyer une nouvelle requete modbus
  15.   boolean bFlagRequeteAEnvoyer=false;//flag indiquant qu'une requete est en attente d'envoie
  16.   byte[] bRequete= new byte[TAILLE_MAX_REQUETE_MODBUS];//tableau contenant la requete modbus
  17.   Short sNombreApplet;
  18.   short NombreApplet;//nombre d'applet sur la page web <PARAM>
  19.   int NumAppletEnCour=1; //identifiant de l'applet pour laquelle on fait la requete modbus
  20.   boolean KeepRunning=true;//variable permettant l'arret du thread de communication modbus
  21.   InetAddress reader_ip = null;//@IP
  22.   int port = 502;//port de connection tcp
  23.   GridBagConstraints c = new GridBagConstraints();
  24.   JTextArea jTextArea1 = new JTextArea();
  25.   JLabel jLabel1 = new JLabel();
  26.   //création d'un thread
  27.   Thread t = new Thread(new Runnable()
  28.   {
  29.     public void run(){Com();}
  30.   });
  31.    
  32. /******************************************************************************/
  33. /**constructeur par defaut
  34.   * <BR>creation d'une instance de la classe tcpip</BR>*/
  35.   public AppletConnection()
  36.   {
  37.     System.out.println("appletconnection::AppletConnection()" );
  38.     InstanceTcpIp = new tcpip();
  39.     tabApplet = new Applet_ComModbus[100]; //creation du tableau d'applet
  40.   }
  41.  
  42. /******************************************************************************/
  43. /**initialisation de l'applet
  44.    * <BR>executé à la 1ere création de l'applet</br>
  45.    * <li>appel à la fonction jbInit() pour initialiser les graphismes de l'applet
  46.    * <li>initialisation de l'adresse ip et du port de connection
  47.    * <li>connection au Xport*/
  48.   public void init()
  49.   {
  50.     System.out.println("appletconnection::init" );
  51.     //recuperation des parametres de l'applet:
  52.     sNombreApplet = new Short(getParameter("NombreApplet" ));
  53.     NombreApplet=sNombreApplet.shortValue();
  54.     try
  55.     {
  56.       jbInit();
  57.     }
  58.     catch (Exception e)
  59.     {
  60.       e.printStackTrace();
  61.     }
  62.     reader_ip = null;
  63.     port = 502;
  64.     //recuperation de l'adresse IP du XPort
  65.     try
  66.     {
  67.       reader_ip = InetAddress.getByName(getCodeBase().getHost());//recuperation de l'@IP
  68.       System.out.println(reader_ip.toString());//mise en string de l'@IP
  69.       InstanceTcpIp.SetIP(reader_ip);//parametrage @IP
  70.       InstanceTcpIp.SetPort(port);//parametrage Port de connection
  71.     }
  72.     catch (UnknownHostException e) {}
  73.     String text = "";
  74.     /* ouverture socket et connection */
  75.     text = InstanceTcpIp.connect();
  76.     jTextArea1.setText(text);//affichage de l'etat de la connection
  77.     //initialisation de la trame ModbusTcp
  78.     bRequete[0] = 1;
  79.     bRequete[1] = 2;
  80.     bRequete[2] = 0;
  81.     bRequete[3] = 0;
  82.     bRequete[4] = 0;
  83.   }
  84. /******************************************************************************/
  85.   public void start()
  86.   {
  87.     System.out.println("appletconnection::start" );
  88.     //t.setPriority(Thread.currentThread().getPriority() + 1);
  89.     AppletInitEnCour++;
  90.   //  finapplet.notify();
  91.     System.out.println("appletconnection::start : AppletInitEnCour="+AppletInitEnCour);
  92.     t.start();//demarrage du thread
  93.    //Com();
  94.   }
  95. /*****************************************************************/
  96.   public void AjouterApplet(Applet_ComModbus lapplet)
  97.   {
  98.     tabApplet[iCountApplet] = lapplet;
  99.     iCountApplet++;
  100.    // System.out.println("AppletConnection::AjouterApplet : iCountApplet="+iCountApplet) ;
  101.    // System.out.println("AppletConnection::AjouterApplet : tabApplet.NbVal="+tabApplet[iCountApplet].NbVal) ;
  102.   }


 
voila en esperant avoir reussi a me faire comprendre.

Reply

Marsh Posté le 18-05-2004 à 16:01:44   

Reply

Marsh Posté le 18-05-2004 à 16:20:49    

euh. non. :D
 
Déjà, tu fait des "this.sCodeFonction = ...."  
Or, sCodeFonction est static, donc, ça me paraît bien coller avec tes histoires de "Les attributs des 2 instances de B sont mélangés : toutes les instances de B se partagent les champs static!
 
Sinon, habituellement, pour faire comminuquer des applets, on utilise du Javascript, qui va permettre d'appeller une méthode d'une applet, à partir d'une autre (ou à partir d'un élément de page : on peut appeller une méthode publique d'un applet à partir de Javascript, et appeller une fonction Javascript depuis une applet, il suffit pour ça d'unclure un package netscape - mais ça marche aussi pour IE - dont je ne me souviens pas le nom! :)  

Reply

Marsh Posté le 18-05-2004 à 17:11:29    

merci pour ta reponse.
je vais bosser la dessus.

Reply

Marsh Posté le 18-05-2004 à 17:24:47    

autre source d'erreur tres importante dans le fonction
public void AjouterApplet(Applet_ComModbus lapplet)
  {
    tabApplet[iCountApplet] = lapplet;
    iCountApplet++;
  }
 
ce code etait accedé par les applet type B en meme temp or rien n'etait protégé (par exemple il remplissait le tableau sans avoir incrémenté  iCountApplet donc ecrasement du pointeur). j'ai remplacé iCountApplet par lapplet.Id et ca marche beaucoup mieux a présent :)
 
edit: j'ai aussi virer les static en trop mais la c'etait une groose boulette de ma part  :whistle:


Message édité par mandagor le 18-05-2004 à 17:26:10
Reply

Sujets relatifs:

Leave a Replay

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