Master Rseaux & Systme
[Link]
Atelier 3 : Rmi-Java Systmes Client serveur
************Dfinition dinterface************* import [Link].*; public interface HelloInterface extends [Link] { /* mthode qui imprime un message prdfini dans lobjet appel */ public String sayHello() throws [Link]; } **********Programme du client***************** import [Link].*; public class HelloClient { public static void main (String [ ] argv) { /* lancer SecurityManager */ [Link] (new RMISecurityManager ()) ; try { /* trouver une rfrence vers lobjet distant */ HelloInterface hello=(HelloInterface) [Link]("rmi://localhost/Hello") ; /* appel de mthode distance */ [Link] ([Link]()) ; } catch (Exception e) { [Link] (" Erreur client : " + e) ; } } ************Classe ralisant linterface********* import [Link].*; import [Link].*; public class Hello extends [Link] implements HelloInterface{ private String message; /* le constructeur */ public Hello (String s)throws RemoteException { message = s ;} ; /* limplmentation de la mthode */ public String sayHello ()throws RemoteException{return message ;} ; } *********** Programme du serveur************* import [Link].*; public class HelloServer { public static void main (String [ ] argv) { /* lancer SecurityManager */ [Link] (new RMISecurityManager()) ; try { /* crer une instance de la classe Hello et lenregistrer dans le serveur de noms */ Naming. rebind ("Hello",new Hello (" Hello world !")) ; System. out. println (" Serveur prt.") ; } catch (Exception e) {[Link](" Erreur serveur : " + e) ;} } }
Phase de compilation Sur la machine serveur : compiler les interfaces et les programmes du serveur javac HelloInterface. java Hello. java HelloServer. java Sur la machine serveur : crer les talons client et serveur pour les objets appels distance ( partir de leurs interfaces) - ici une seule classe, Hello rmic -keep Hello N. B. cette commande construit et compile les talons client Hello_ Stub. java et serveur Hello_ Skel. java. Loption -keep permet de garder les sources de ces talons Sur la machine client : compiler les interfaces et le programme client 1
Master Rseaux & Systme javac HelloInterface. java HelloClient. java Phase dexcution
[Link]
La scurit est importante lorsquil y a tlchargement de code (il peut tre dangereux dexcuter le code charg depuis un site distant) Mise en oeuvre La politique de scurit spcifie les actions autorises, en particulier sur les sockets Exemple de contenu du fichier java. policy Permet dutiliser les sockets comme indiqu. Toute autre utilisation est interdite
[Link] traduit la scurit systme
Scurit
exemple de fichier grant la scurit systme :
grant { permission [Link] "*:1024-65535","connect, accept"; permission [Link] "*:80","connect"; permission [Link]; }; Sauvegarder ce code sous forme de [Link] et mettez dans le mme rpertoire contenant les autres classes
Compilation avec rmic : The rmic compiler generates stub, and skeleton class files for remote objects. These classes files are generated from the compiled Java programming language classes that contain remote object implementations. A remote object is one that implements the interface [Link]. The classes named in the rmic command must be classes that have been compiled successfully with the javac command and must be fully package qualified. For example, running rmic on the class file name HelloImpl as shown here: rmic [Link] creates the HelloImpl_Skel.class and HelloImpl_Stub.class files in the hello subdirectory (named for the class's package).
Start the Java RMI registry start rmiregistry Start the server
Sur une fentre command dos lancer la serveur
java -[Link]=[Link] HelloServer
Sur une autre fentre command dos lancer le client
Run the client java -[Link]=[Link] HelloClient Note : faire attention aux espace blanc The output from the client is the following message: Response: Hello, world!
En utilisant EDI Netbean
import [Link].*; import [Link].*; import [Link].*; public class Hello extends HelloInterface
[Link]
implements
Master Rseaux & Systme
{
[Link]
private String message; /* le constructeur */ public Hello (String s)throws RemoteException { message = s ;} ; /* limplmentation de la mthode */ public String sayHello ()throws RemoteException{return message ;} ; public static void main(String A[]){ //lancer security manager //if([Link]() == null) [Link](new RMISecurityManager()); try{ [Link]("Hello", new Hello("bonjour")); [Link]("Serveur pret"); } catch(Exception e){ [Link]("erreur serveur \t"+e); } } } *******************Client************************** import [Link].*; public class HelloClient { public static void main (String [ ] argv) { /* lancer SecurityManager */ // [Link] (new RMISecurityManager ()) ; try {/* trouver une rfrence vers lobjet distant */ HelloInterface hello=(HelloInterface) [Link]("rmi://localhost/Hello") ; /* appel de mthode distance */ [Link] ([Link]()) ; } catch (Exception e) { [Link] (" Erreur client : " + e) ; }}} ********************Interface************************* import [Link].*; public interface HelloInterface extends [Link] { /* mthode qui imprime un message prdfini dans lobjet appel */ public String sayHello() throws [Link];}
Pour pouvoir utiliser les programme Javac, Java et rmiregistry partir de nimporte quil rpertoire, le systme doit connatre leur chemin de Parcours utilisez la commande suivant pour fixer le chemin menant au path du rpertoire \bin contenant les diverses programme de java. set path=C:\Program Files\Java\jdk1.5.0_01\bin; Sur la machine serveur : compiler en utilisant netBean les interfaces et lapplication serveur
HelloInterface. java [Link] [Link]
Master Rseaux & Systme Ces deux fichiers sont enregistrs par netbean dans
[Link]
C:\Documents and Settings\karim\rmireg\src Les fichiers compiler [Link] [Link] [Link] Sont enregistrs dans: C:\Documents and Settings\karim\rmireg\build\classes Avant de lancer le serveur il faut se positionner au rpertoire : C:\Documents and Settings\karim\rmireg\build\classes> start rmiregistry Travail faire : Lobjectif : Ecrire une application rpartie permettant de grer des comptes bancaires Soit la classe compte suivante : class Compte{ public int nbComptes; protected float solde; private int code; public Compte(float soldeInitial){ nbComptes++; code=nbComptes; solde=soldeInitial; } public int getCode(){return code;} public float getDecouvert(){return decouvert;} public float getSolde(){ return solde;}
public void retirer(float mt){ if(mt<solde+decouvert) solde-=mt; } public void verser(float mt){ solde+=mt;} public void setDecouvert(float d){decouvert=d; } }
Crer un compte en banque. De verser un montant dans votre compte Retirer un montant de votre compte Fixer un dcouvert . Les mthodes distantes sont : float getSolde(); void verser(float mt); void retirer(float mt); float getDecouvert(); 1. 2. 3. 4. Ecrire une interface Compte drivant de Remote qui dclare les mthodes distantes. Ecrire une classe CompteImpl qui gre la partie serveur de notre application rpartie. Ecrire une classe ClientBanque qui gre la partie client de notre application rpartie. On veut maintenant que le serveur, prvienne le client quand le solde de son compte devient ngatif ou infrieur une valeur choisie par le client. Quel mcanisme, vu en cours, peut tre utilis ? Modifiez linterface et les classes pour grer cette situation. Compiler toutes les classes, gnrer les stubs (rmic CompteImpl ), rcuprer le fichier [Link] Lancer le serveur : java -[Link]=banque\[Link] compteImpl
5. 6.
Master Rseaux & Systme
7. Lancer clients et tester lapplication rpartie.
[Link]
Master Rseaux & Systme
[Link]
Solution : *****************serveur***************** import [Link].*; import [Link].*; import [Link].*; class Compte extends [Link] implements InterfaceCompte{ private int nbComptes=0; protected float solde; protected float decouvert; private int code; public Compte(float soldeInitial) throws RemoteException{ nbComptes++; code=nbComptes; solde=soldeInitial; } public Compte(float soldeInitial,float _decouvert)throws RemoteException{ nbComptes++; code=nbComptes; solde=soldeInitial; decouvert=_decouvert; } public int getCode() {return code;} public float getSolde()throws RemoteException{return solde;} public String retirer(float mt) throws RemoteException{ if(mt<solde+decouvert) {solde-=mt; return "";} else return "vous avez depasse decouvert permis"; } public void verser(float mt) throws RemoteException{solde+=mt;} public void setDecouvert(float d){ decouvert=d; } public float getDecouvert() throws RemoteException{return decouvert;} public static void main(String A[]){ //lancer security manager //[Link](new RMISecurityManager()); try{ //creation d'une instance de la classe compteet l'enregistrer dans le serveur de noms [Link](1099); [Link]("compte",new Compte(100000)); [Link]("Serveur pret"); } catch(Exception e){ [Link]("erreur serveur \t"+e); }}}
*********************client*********************************** import [Link].*; public class ClientCompte{ public static void main(String A[]){ try{ //Trouver une reference vers l'objet Distant InterfaceCompte IC=(InterfaceCompte)[Link]("rmi://[Link]/compte");
Master Rseaux & Systme
[Link](1009); [Link]([Link](90000000)); [Link]("le solde est de : \t"+[Link]());
[Link]
} } *****************************InterfaceCompte************* import [Link].*; public interface InterfaceCompte extends [Link] { public float getSolde()throws [Link]; public String retirer(float mt)throws [Link]; public void verser(float mt)throws [Link]; public float getDecouvert()throws [Link]; }
} catch(Exception e){ [Link]("erreurs de clients \t"+e); }