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

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1379587
Atropos
Peace Love Death Metal
Posté le 02-06-2006 à 10:47:32  profilanswer
 

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

mood
Publicité
Posté le 02-06-2006 à 10:47:32  profilanswer
 

n°1379608
Sebou77
French Tech powaa :-)
Posté le 02-06-2006 à 10:57:16  profilanswer
 

cherche des tuto sur la synchronisation des threads :)

n°1379675
Atropos
Peace Love Death Metal
Posté le 02-06-2006 à 11:36:31  profilanswer
 

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 :??:

n°1380174
Atropos
Peace Love Death Metal
Posté le 02-06-2006 à 19:56:54  profilanswer
 

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
n°1380361
moi23372
Posté le 03-06-2006 à 11:01:58  profilanswer
 

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

n°1380365
Atropos
Peace Love Death Metal
Posté le 03-06-2006 à 11:16:14  profilanswer
 

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:

n°1380376
masklinn
í dag viðrar vel til loftárása
Posté le 03-06-2006 à 12:00:25  profilanswer
 

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?

n°1380400
Atropos
Peace Love Death Metal
Posté le 03-06-2006 à 12:39:11  profilanswer
 

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.

n°1380564
Chronoklaz​m
Posté le 03-06-2006 à 20:24:47  profilanswer
 

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

n°1380656
Atropos
Peace Love Death Metal
Posté le 03-06-2006 à 23:48:57  profilanswer
 

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 :/

mood
Publicité
Posté le 03-06-2006 à 23:48:57  profilanswer
 

n°1380784
Chronoklaz​m
Posté le 04-06-2006 à 15:08:18  profilanswer
 

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

n°1380859
Atropos
Peace Love Death Metal
Posté le 04-06-2006 à 17:40:03  profilanswer
 

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


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

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

 

Sujets relatifs
[java] PB lancement d'un AppletJava Transformation XSLT résultat String
Pas important : isset en Java ? [Résolu]synchroniser deux bdd en java
[Réglé] [java débutant] afficher correctement des jpanels[Résolu] Java - Jsp - ArrayList dans ArrayList
menu en javaServeur web en C
[Resolu] Construire un tar en java[Java] Programmation concurrente et BlockingQueues
Plus de sujets relatifs à : [Java] pas de synchro entre le serveur et les clients


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