IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

petit pb de synchro


Sujet :

Langage Java

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut petit pb de synchro
    Bonjour,
    j'ai développé un serveur concurent qui gere plusieurs clients en meme tps.
    le probleme c'est que j'ai un une variable qui s'incremente à chaque requette d'un client (un client pouvant effectuer plusieurs requettes) pour tous les clients, a la fin j'ai besoin d'afficher cette variable a chaque client, lorsque tous les clients connectés auront fini leur requettes sachant que tous les clients ne finissent pas leurs requettes en meme temps.
    Avez vous une idée de ce que je dois faire?

  2. #2
    Membre éclairé Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Par défaut
    tu peux synchroniqer tes thread en mettant le modifier synchronized dans la signature de ta méthode pour synchroniser les méthodes que tu veux. Sinon pour ne synchroniser que certaines parties du code, jette un oeil à ReentrantLock (un truc comme ça), y a déjà des topics postés sur le sujet.

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    j'ai déjà essayé ca.
    bon en gros voila mon pb:la variable dont je parlais est count:

    public class Serv {
    private final ServerSocket serverSocket;
    private static int count=0;//nombre de requettes sur le serveur
    //...

    public Serv(int port) throws IOException{
    //initialisation du serveur attaché au port choisi
    serverSocket =new ServerSocket(port);
    System.out.println("Serveur attache a :"+
    serverSocket.getLocalSocketAddress()+"\n");
    }

    public void launch()throws IOException
    {
    while(true)
    {
    final Socket client=serverSocket.accept();
    new Thread(new Runnable()
    {
    public void run()
    {
    serveClient(client);
    }
    }).start();
    }
    }
    public static void serveClient(Socket client) {

    String pseudo = "";
    try {
    //...code trop long
    BufferedReader br=new BufferedReader(new InputStreamReader
    (client.getInputStream(),"UTF8"));
    BufferedWriter bw=new BufferedWriter(new OutputStreamWriter
    (client.getOutputStream(),"UTF8"));
    bw.write("==>Bonjour choisir un pseudo: ");
    bw.newLine();
    bw.flush();
    //...
    // boucle: tant que le client effectue une requette
    count++;
    //fin de boucle

    bw.write("le nombre de requettes sur le serveur est de:"
    +count);//ici il faut attendre la fin des requettes de tous les clients
    bw.newLine();
    bw.flush();
    //...
    }catch (IOException e) {

    e.printStackTrace();
    }
    finally{
    try{
    client.close();
    }catch(IOException e){}
    }
    }
    public static void main(String[] args) throws IOException {
    Serv server;
    //...code trop long
    server=new Serv(Integer.parseInt(args[0]));
    server.launch();
    }
    }

    alors comment attendre que tous les clients connectés aient fini leurs requettes pour afficher la variable count à tous les clients.

  4. #4
    Membre éclairé Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Par défaut
    en efet, utiliser une variable d'empêche de synchroniser son incrémentation. Il suffit tout simplement de créer une méthode increment() avec le mot clef synchronized et pour seul code count++
    Simple et efficace.

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    merci, mais j'ai déjà essayé de synchroniser comme t'as dit et ca n'empeche pas l'affichage de la variable avant que tous les utilisateurs aient terminé leurs requettes.j'ai meme crée une fonction affche() avec le mot synchronized mais sans effet.
    S'il y a autre solution ou autre proposition elle est la bienvenue

  6. #6
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Razgriz
    en efet, utiliser une variable d'empêche de synchroniser son incrémentation. Il suffit tout simplement de créer une méthode increment() avec le mot clef synchronized et pour seul code count++
    Simple et efficace.
    Tu peux simplement faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    synchronized(unVerrou) { count++; }

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    oui j'ai déjà essayé mais ca ne marche pas non plus dans mon contexte.
    Franchement je sais pas quoi faire ave cette histoire là!!!

  8. #8
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Je n'ai pas très bien compris ce que tu cherchais à faire...

    En gros, supposons qu'il y a 5 clients qui se connectent, tu veux envoyer la valeur de la variable à quel moment?

  9. #9
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    ok je t'explique: supposant qu'il y a 5 clients connectés au serveur, chaque client est géré par un thread, chaque client fait ses requettes et un client peut terminer avant les autres, je veux attendre que tous les clients connectés aient fini leurs requettes pour envoyer la variable.voilà.

  10. #10
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par dimitri1233
    ok je t'explique: supposant qu'il y a 5 clients connectés au serveur, chaque client est géré par un thread, chaque client fait ses requettes et un client peut terminer avant les autres, je veux attendre que tous les clients connectés aient fini leurs requettes pour envoyer la variable.voilà.
    En même temps, si tes clients sont connectés pour attendre de recevoir la variable, il ne se déconnectent pas, et donc personne se déconnecte...

  11. #11
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    oui t'as tout compris personne ne se deconnecte avant de recevoir la variable count.

  12. #12
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par dimitri1233
    oui t'as tout compris personne ne se deconnecte avant de recevoir la variable count.
    Ne se déconnecte pas?

    Dans ce cas là, ils vont tous s'attendre les uns les autres...

  13. #13
    Membre éclairé
    Avatar de Voyvode
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 476
    Par défaut
    Du groupe je suis sûrement celui qui a le plus faible niveau en Java mais il semblerait qu'ici le problème soit d'ordre logique. J'ai une idée, mais je ne pourrait pas donner la traduction en code Java de ce que je vais exprimer...

    Pour résumer :
    - La variable count est reçu à la déconnexion,
    - Pour pouvoir se déconnecter, il faut recevoir la variable count.

    Mon idée est la suivante :
    Les clients font leurs tâches. Dès qu'ils ont fini, ils envoi une requête de déconnexion (mise en pause du thread peut-être ?)
    Dès que tout le monde a émis cette requette (que tous les threads sont en pause ?), on leur balance la variable count et bye bye ! Il sont déconnecté à ce moment là.

    J'espère avoir pu aider à mon petit niveau...

  14. #14
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Par défaut
    Citation Envoyé par Willy_XIII
    Du groupe je suis sûrement celui qui a le plus faible niveau en Java mais il semblerait qu'ici le problème soit d'ordre logique. J'ai une idée, mais je ne pourrait pas donner la traduction en code Java de ce que je vais exprimer...

    Pour résumer :
    - La variable count est reçu à la déconnexion,
    - Pour pouvoir se déconnecter, il faut recevoir la variable count.

    Mon idée est la suivante :
    Les clients font leurs tâches. Dès qu'ils ont fini, ils envoi une requête de déconnexion (mise en pause du thread peut-être ?)
    Dès que tout le monde a émis cette requette (que tous les threads sont en pause ?), on leur balance la variable count et bye bye ! Il sont déconnecté à ce moment là.

    J'espère avoir pu aider à mon petit niveau...
    bonne idée mais c'est pas si evident de la mettre en oeuvre ce que tu viens de dire:
    mettre tous les threads en pause risque de coupper les requettes des clients sachant qu'un client peut finir ses requettes avant les autres et la les clients recevront une reponse fausse(pas la valeur exacte de la varible) tu vois un peu le truc?

  15. #15
    Membre éclairé
    Avatar de Voyvode
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 476
    Par défaut
    mettre tous les threads en pause risque de coupper les requettes des clients sachant qu'un client peut finir ses requettes avant les autres
    Ce que je voulais dire, c'est que c'est le client qui met en pause son propre thread (avec une connerie genre "Envoyer une requête de déconnexion") qui implique donc que le client ne fera plus rien après. Une fois que tout le monde a mis en pause son thread, on balance la variable et on déconnecte réellement tout le monde.

  16. #16
    Membre éclairé Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Par défaut
    Et imagine qu'il y ait 5 utilisateurs connectés, 4 qui attendent d'êtres déconenctés et un dernier qui va bientôt finir. Un nouvel utilisateur se connecte... Les 5 autres vont devoir encore attendre,c'est le cauchemard. Est-tu certain que envoyer la variable incrémentée dès qu'il n'y a plus d'utilisateurs en ligne soit la bonne approche?

    D'un point de vue logique, en quoi consiste cette variable et à quoi sert-elle?

Discussions similaires

  1. [Petite requête] Nombre de transactions par jour
    Par Braim dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/04/2003, 11h53
  2. Réponses: 3
    Dernier message: 28/02/2003, 18h06
  3. Réponses: 3
    Dernier message: 16/12/2002, 17h12
  4. [TP]TP s'affiche en tout petit sous w2000
    Par spiroucarolo dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 21/10/2002, 17h36
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 22h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo