ExempleCh03_03_FactoryDeviseRetourTélécharger Exemple d'un facory simple de création et stockage des devises monétaires. Chaque devise est un stub géré par le factory README.txt Le Serveur exécute un OD qui est un factory de devises monétaires. Les devises peuvent être créées à distance. Les devises sont utilisées à distance. Les devises sont des stubs et ne sont pas enregistrées dans un annuaire. C'est le factory qui stocke les stubs. Pour compiler : ------------- javac *.java Pour executer : --------------- Pour executer le serveur java Serveur Dans une autre fenêtre de commande: java Client <vide ou adresse IP du serveur> Client.java // Client.java // Le client utilise le factory distant pour : // - creer deux nouvelles devises par defaut // - permet de créer une nouvelle devise et la tester // import java.awt.*; import java.io.*; import java.net.*; /* Les packages de RMI */ import java.rmi.*; import java.rmi.server.*; public class Client { public static void main(String args[]) throws RemoteException,IOException,NotBoundException { // Adresse Ip ou nom de domaine du serveur String hostServeur="localhost"; if (args.length==1) hostServeur=args[0]; // Connexion au factory de devise FactoryDeviseInt fact = (FactoryDeviseInt)Naming.lookup("rmi://"+hostServeur+":9100/DEVISES"); // Création à distance de deux devises par défaut fact.creerDevise("FRANCS","EURO",1.0/6.56); fact.creerDevise("FRANCS","DOLLARS",0.98); // Programme de test de creation de devise et // d'utilisation des devises // while (true) { double val,resultat; DataInputStream in = new DataInputStream(System.in); System.out.println("Creer un devise (o,n) ?"); String rep = in.readLine(); if (rep.equals("o")) { System.out.print("Nom1 : "); String nomd1 = in.readLine(); System.out.print("Nom2 : "); String nomd2 = in.readLine(); System.out.print("Taux : "); double taux = Double.parseDouble(in.readLine()); fact.creerDevise(nomd1,nomd2,taux); } System.out.println("Conversion de "); String nom1 = in.readLine(); System.out.println("vers "); String nom2 = in.readLine(); DeviseInt devise = fact.getDevise(nom1,nom2); System.out.print(nom1+" : "); System.out.flush(); val = Double.parseDouble(in.readLine()); resultat = devise.convertir1(val); System.out.println(nom2+" : "+resultat); } } } Devise.java import java.awt.*; import java.io.*; import java.net.*; /* Les packages de RMI */ import java.rmi.*; import java.rmi.server.*; public class Devise extends UnicastRemoteObject implements DeviseInt { private String nom1; private String nom2; private double taux; public Devise(String n1,String n2,double t) throws RemoteException { super(9101); nom1=n1; nom2=n2; taux=t; } public void setTaux(double t) { taux=t; } public double convertir1(double val) throws RemoteException { return(val*taux); } public double convertir2(double val) throws RemoteException { return(val/taux); } public String getNom1() throws RemoteException { return(nom1); } public String getNom2() throws RemoteException { return(nom2); } } DeviseInt.java /* ============================================== FIC : DeviseInt.java ROL : Interface d'une devise AUT : JL DAT : 05/01/02 COM : ============================================== */ import java.rmi.*; public interface DeviseInt extends Remote { public double convertir1(double val) throws RemoteException; public double convertir2(double val) throws RemoteException; public String getNom1() throws RemoteException; public String getNom2() throws RemoteException; } FactoryDevise.java // FactoryDevise.java // Le factory de devise est un OD qui permet de créer a distance // une nouvelle devise qui est aussi un OD // Il permet aussi d'obtenir le stub de n'importe quelle devise. // import java.awt.*; import java.io.*; import java.net.*; import java.util.*; /* Les packages de RMI */ import java.rmi.*; import java.rmi.server.*; public class FactoryDevise extends UnicastRemoteObject implements FactoryDeviseInt { // Stockage des OD qui sont des devises indexées par les noms de change // private Hashtable<String,Devise> devises; // Constructeur public FactoryDevise() throws RemoteException { super(9101); devises = new Hashtable<String,Devise>(); } // Creation distante d'une devise public void creerDevise(String nom1, String nom2,double taux) throws RemoteException { System.out.println("Creation d'une devise: "+nom1+" "+nom2); Devise devise = new Devise(nom1,nom2,taux); devises.put(nom1+"_"+nom2,devise); } // Retourne le stub d'une devise pour le client public DeviseInt getDevise(String nom1, String nom2) throws RemoteException { try{ Devise devise = devises.get(nom1+"_"+nom2); Remote stub = UnicastRemoteObject.toStub((Remote)devise); return((DeviseInt)stub); }catch(NoSuchObjectException ex){return null;} } } FactoryDeviseInt.java // FactoryDeviseInt.java // L'interface du factory qui definit ses services import java.rmi.*; public interface FactoryDeviseInt extends Remote { public void creerDevise(String nom1, String nom2,double taux) throws RemoteException; public DeviseInt getDevise(String nom1, String nom2) throws RemoteException; } Serveur.java // Serveur.java // Le serveur cree l'annuaire, cree le factory et l'enregistre dans l'annuaire // import java.io.*; import java.awt.*; import java.net.*; /* Les packages de RMI */ import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; public class Serveur { public static void main(String args[]) throws RemoteException,ServerNotActiveException,MalformedURLException, IOException { // Creation de l'annuaire s'il n'existe pas déjà try{ LocateRegistry.createRegistry(9100); } catch(Exception ex){}; // Creation du factory de devise // Naming.rebind("rmi://localhost:9100/DEVISES", new FactoryDevise()); } } compil.bat mkdir bin del /f /s /q bin\*.class javac -d bin *.java pause runClient.bat cd bin java Client pause runServeur.bat cd bin java Serveur pause