[Java] pas de synchro entre le serveur et les clients

pas de synchro entre le serveur et les clients [Java] - Java - Programmation

Marsh Posté le 02-06-2006 à 10:47:32    

Bonjour,  
 
J'ai (encore :D) un petit problème.
Je programme en ce moment un client et son serveur, qui doivent donc s'échanger des informations.
Vu qu'il y a plusieurs variables à échanger, au sein du parcours d'une même boucle il y a plusieurs envois et plusieurs réceptions. Ca marche très bien lorsqu'un seul client est connecté, mais dès le 2è tout est désynchronisé et les variables reçoivent le contenu d'autres variables :'( Bref ça devient le souk.
Je n'ai rien trouvé concernant la synchronisation des échanges en java (toutes mes methodes faisant intervenir ces variables sont bien "synchronized" ) donc si quelqu'un avait des infos sur comment échanger proprement des données avec plusieurs clients...
 
Merci d'avance :)

Reply

Marsh Posté le 02-06-2006 à 10:47:32   

Reply

Marsh Posté le 02-06-2006 à 10:57:16    

cherche des tuto sur la synchronisation des threads :)

Reply

Marsh Posté le 02-06-2006 à 11:36:31    

Merci pour ton aide :jap:
 
J'ai bien compris la partie concernant "synchronized", mais j'ai du mal concernant wait/notify.
 
Ici les threads ne sont pas sur la même machine, donc je ne vois pas comment ils peuvent notifier leur dispo pour l'échange sans échanger des données avant :D
 
Ou alors c'est seulement valable pour les threads du serveur :??:

Reply

Marsh Posté le 02-06-2006 à 19:56:54    

Qu'est ce qui ne va pas dans ce code :??:
 
Partie client :

Code :
  1. synchronized public void run()
  2.  {
  3.  try
  4.  {
  5.     os = socket.getOutputStream();
  6.        is = socket.getInputStream();
  7.        IN = new DataInputStream(is);
  8.        INs = new InputStreamReader(is);
  9.        INb = new BufferedReader(INs);
  10.        OUT = new DataOutputStream(os);
  11.  }
  12.  catch (Exception e) {System.err.println(e);}
  13.  try
  14.   {
  15.   while (true)
  16.    {
  17.    int i=0;
  18.    nbrClients = (int)IN.readInt();
  19.    numClient = (int)IN.readInt();
  20.    OUT.writeInt(Coordx[numClient]);
  21.    OUT.writeInt(Coordy[numClient]);
  22.    OUT.writeInt(Force[numClient]);
  23.    OUT.writeInt(Vie[numClient]);
  24.    OUT.flush();
  25.    do {
  26.     Coordx[i] = (int)IN.readInt();
  27.     Coordy[i] = (int)IN.readInt();
  28.     Force[i] = (int)IN.readInt();
  29.     Vie[i] = (int)IN.readInt();
  30.     i++;
  31.    } while(i<nbrClients);
  32.    }
  33.   }
  34.  catch (Exception e) {System.err.println(e);}
  35.  finally
  36.   {
  37.   System.out.println("Connexion interrompue\n" );
  38.   }
  39.  }


 
Partie serveur :
 

Code :
  1. Synchronized public void run()
  2.  {
  3.                        int test=0;
  4.    try {
  5.    InputStream is = socket.getInputStream();
  6.                 OutputStream os = socket.getOutputStream();
  7.                 IN = new DataInputStream(is);
  8.          INs = new InputStreamReader(is);
  9.          INb = new BufferedReader(INs);
  10.          OUT = new DataOutputStream(os);
  11.                
  12.                 _numClient = serveur.addClient(OUT);
  13.                 nbrClients=serveur.getNbrClients();
  14.                 System.out.println("Connection de ["+_numClient+"]" );
  15.                                
  16.     while(true)
  17.    {
  18.    int i=0;
  19.    serveur.sendAll(nbrClients);
  20.    OUT.writeInt(_numClient);
  21.    OUT.flush();
  22.    Coordx[_numClient] = (int)IN.readInt();
  23.    Coordy[_numClient] = (int)IN.readInt();
  24.    Force[_numClient] = (int)IN.readInt();
  25.    Vie[_numClient] = (int)IN.readInt();
  26.    do {
  27.     serveur.sendAll(Coordx[i]);
  28.     serveur.sendAll(Coordy[i]);
  29.     serveur.sendAll(Force[i]);
  30.     serveur.sendAll(Vie[i]);
  31.     i++;
  32.    } while(i<nbrClients);
  33.    }
  34.    } catch (Exception e) {System.err.println("test "+e);}
  35.    finally
  36.        {
  37.         try
  38.           {
  39.      
  40.           System.out.println("deconnection de ["+_numClient+"]" );
  41.           serveur.delClient(_numClient);
  42.           socket.close();
  43.           }
  44.          catch (IOException e){System.err.println(e); }
  45.        }
  46.  }


 
La méthode sendAll :

Code :
  1. synchronized public void sendAll(int var)
  2.      {
  3.       for (int i = 0; i < _tabClients.size(); i++)
  4.        {
  5.        OUT = (DataOutputStream) _tabClients.elementAt(i);
  6.    
  7.          if (OUT != null)
  8.           {
  9.            try{
  10.      
  11.            OUT.writeInt(var);
  12.            OUT.flush();     
  13.                 
  14.            } catch(Exception e) {System.err.println(e);}
  15.           }
  16.        }
  17.      }


 
Désolé pour la longueur :whistle:


Message édité par Atropos le 02-06-2006 à 19:58:14
Reply

Marsh Posté le 03-06-2006 à 11:01:58    

je ne comprends pas pkoi si ton client et ton serveur son en java, pkoi tu n'utilise pas le mécanisme de sérialisation d'objet pour échanger tes informations. ça te permettrait de sérialiser des objets complets en un seul coup déjà... Je crois qu'ici la méthode est déjà mal choisie

Reply

Marsh Posté le 03-06-2006 à 11:16:14    

moi23372 a écrit :

je ne comprends pas pkoi si ton client et ton serveur son en java, pkoi tu n'utilise pas le mécanisme de sérialisation d'objet pour échanger tes informations. ça te permettrait de sérialiser des objets complets en un seul coup déjà... Je crois qu'ici la méthode est déjà mal choisie


En fait au début j'étais parti sur cette méthode, mais j'avais beaucoup de problèmes avec :
Les tableaux arrivaient vide, et à partir de 2 clients les échanges s'arrêtaient  :??:  
Si vous connaissez des tutoriaux ou des exemples de code pour des exemples de réseau avec plusieurs clients et des objets à envoyer je suis preneur, parce que pour l'instant je crois que je ne maitrise pas certaines subtilités de java  :whistle:

Reply

Marsh Posté le 03-06-2006 à 12:00:25    

Atropos a écrit :

En fait au début j'étais parti sur cette méthode, mais j'avais beaucoup de problèmes avec :
Les tableaux arrivaient vide, et à partir de 2 clients les échanges s'arrêtaient  :??:


Tu utilisais bien des Object*Stream pour stransférer tes objets?

Reply

Marsh Posté le 03-06-2006 à 12:39:11    

masklinn a écrit :

Tu utilisais bien des Object*Stream pour stransférer tes objets?


Oui ObjectInputStream et ObjectOutputStream  :jap:  
Si j'envoyais avec la méthode WriteObject() toutes les variables étaient vides à l'arrivée.
Avec WriteUnshared() il n'y avait que les tableaux de vides.

Reply

Marsh Posté le 03-06-2006 à 20:24:47    

Ca serait 100 fois moins prise de tête avec RMI !

Reply

Marsh Posté le 03-06-2006 à 23:48:57    

Tu aurais un lien qui expliquerait le principe? Je ne connais pas du tout, et les tutoriaux que j'ai trouvés ne montrent pas grand chose :/

Reply

Marsh Posté le 03-06-2006 à 23:48:57   

Reply

Marsh Posté le 04-06-2006 à 15:08:18    

T'es sur de ce que tu dit la ?
 
http://www.google.fr/search?q=Java [...] r:official
 
 En gros, au lieu de faire du Message Passing n'importe comment, utiliser le principe d'appel de methodes sur des objets distants, t'a plus a te prendre la tête avec les buffers etc ...
 
Les fundamentals : http://developer.java.sun.com/deve [...] i/RMI.html

Reply

Marsh Posté le 04-06-2006 à 17:40:03    

Merci beaucoup :)
En effet ça marche très très bien :jap:

Reply

Sujets relatifs:

Leave a Replay

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