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

Java EE Discussion :

Java RMI multi-clients


Sujet :

Java EE

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 12
    Par défaut Java RMI multi-clients
    Salut,

    j'ai un soucis de compréhension concernant le RMI et la possibilité de simuler plusieurs clients

    Pour résumer j'ai un annuaire (objet distant) et je dois simuler plusieurs clients pouvant ajouter (put) ou retrouver (get) un numéro

    je vous présente mon code

    interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface Directory extends Remote {
        void put(String nom, String num) throws RemoteException;
        String get(String nomCherche) throws RemoteException;
    }
    class implementant l'interface

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class DirectoryImpl extends UnicastRemoteObject implements Directory {
     
        HashMap<String, String> annuaire = new HashMap<String, String>();
     
        protected DirectoryImpl() throws RemoteException {
            super();
        }
     
        //ajout dans la map
        public void put(String nom, String num) throws RemoteException {
            annuaire.put(nom, num);
        }
     
        //methode renvoyant le resultat d'une recherche
        public String get(String nomCherche) throws RemoteException {
            String num = annuaire.get(nomCherche);
            return num;
        }
    }
    serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class ServerImpl {
     
        public static void main(String[] args) {
            try {
                //creation registre
                Registry r = LocateRegistry.createRegistry(1099);
                //instance de la class
                DirectoryImpl dI = new DirectoryImpl();
                //instance enregistré dans le registre
                r.rebind("directory", dI);
     
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
        }
     
    }
    et enfin client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class Client1 { 
        public static void main(String[] args) {
            try {
     
     
                Directory d = ((Directory)Naming.lookup("rmi://localhost/directory"));
                Directory d2 = ((Directory)Naming.lookup("rmi://localhost/directory"));
                d.put("Pierre", "0608");
                d2.put("Gerrard", "0609");
                System.out.println(d2.get("Pierre"));
     
            } catch (MalformedURLException | RemoteException | NotBoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
        }
     
    }

    Je suppose que ce code ne simule pas du tout plusieurs clients, je me demande comment faire, je suppose qu'il doit y avoir une histoire de thread mais je n'arrive pas à comprendre.
    Pour commencer j'aimerai simuler plusieurs clients mais de manière séquentielle, sans concurrence voir déjà si j'arrive a comprendre

    Si vous pouvez m'aider

    ps : il n'y a pas d'erreur de fonctionnement, tout marche et Pierre est bien trouvé dans le hashMap

  2. #2
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 326
    Billets dans le blog
    12
    Par défaut
    Pour commencer j'aimerai simuler plusieurs clients mais de manière séquentielle, sans concurrence voir déjà si j'arrive a comprendre
    Je pense que c'est ce que tu fais déjà dans ton exemple, les méthodes exécutés par tes deux objets (d et d2) sont synchrones, donc tu fais du séquentiel.

    La première chose à laquelle tu dois faire gaffe, c'est que RMI est une architecture SOA, ton implémentation de la classe Directory n'est pas censé avoir d'attribut car ton objet peut potentiellement être détruit et ré-instancié par le serveur si le service n'est pas sollicité. A la limite tu peux utiliser un attribut static. Ensuite, comme tu es toujours dans une architecture SOA, il faut faire gaffe à ton environnement qui est multithread, HashMap n'est pas threadsafe (c'est-à-dire que tu ne doit pas l'utiliser dans un environnement multithread), mais tu peux le rendre threadsafe.

    Je pense que si tu souhaites "simuler" plusieurs clients "à la fois", tu peux juste utiliser un stub et exécuter des actions via un pool de thread :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    import java.util.*;
    import java.util.concurrent.*;
    import java.lang.*;
    import java.io.*;
     
    // J'ai mocké ta classe Directory
    class Directory {
        private static Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
     
        public void put(String key, String value){
            map.put(key, value);
        }
     
        public Map<String, String> getMap(){
            return map;
        }
    }
     
    class DemoClients {
        public final static int SIZE = 3; // Nombre de client
     
        public static void main (String[] args) throws java.lang.Exception {
            Directory d = new Directory(); // <=> Naming.lookup("rmi://localhost/directory");
     
            // L'action que doit effectuer chacun de tes clients est représenté par un callable
            Callable<Object>[] callables = new Callable[SIZE];
            for(int i = 0; i < SIZE; i++){
                final int i2 = i; 
                callables[i] = () -> {
                    d.put("name"+i2, "value"+i2);
                    return null;
                };
            }
     
            // Exécution des actions de tes clients via un pool de thread (cf: non-séquentiel)
            ExecutorService es = Executors.newFixedThreadPool(SIZE);
            es.invokeAll(Arrays.asList(callables));
            es.shutdown();
     
            // Affichage 
            for (Map.Entry<String, String> e : d.getMap().entrySet()) {
                System.out.println("Key : " + e.getKey() + " Value : " + e.getValue());
            }
        }
    }

    Lien de la démo : http://ideone.com/bEFtQO

    J'ai essayé de commenter pour que tu comprennes mieux, mais si tu as des questions n'hésite pas
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

Discussions similaires

  1. Problème Socket Java architecture Serveur multi Client
    Par abdelhak_z dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 23/03/2015, 13h42
  2. Java RMI Client-Serveur sur deux machines différentes
    Par chercheur111 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 10/12/2014, 17h44
  3. Java RMI : Liste des clients
    Par med7sassi dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 20/03/2012, 16h20
  4. Java.rmi.NotBoundException (rmi execution client)
    Par charles9 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 21/07/2008, 15h10
  5. Création d'un Serveur Multi Client
    Par N*E*R*D dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/03/2004, 17h13

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