User Tools

Site Tools


sysrep:rmi

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
sysrep:rmi [2013/10/09 07:38] – [Generic Engine] orelsysrep:rmi [2024/03/18 15:06] (current) – external edit 127.0.0.1
Line 99: Line 99:
  
   * Modifez l’interface "Hello" en ajoutant de nouvelles méthodes, comme par exemple :   * Modifez l’interface "Hello" en ajoutant de nouvelles méthodes, comme par exemple :
-    * String sayHello() throws RemoteException; 
     * String sayEcho(String echo) throws RemoteException;     * String sayEcho(String echo) throws RemoteException;
   * Ajoutez la méthode suivante, qui manipule le type //Message// défini par l'utilisateur. Dans ce dernier cas, le type Message doit hériter de l'interface "java.io.Serializable"   * Ajoutez la méthode suivante, qui manipule le type //Message// défini par l'utilisateur. Dans ce dernier cas, le type Message doit hériter de l'interface "java.io.Serializable"
Line 105: Line 104:
   * Ajoutez la méthode suivante qui termine proprement le serveur. Consultez la documentation de la classe "java.rmi.server.UnicastRemoteObject".   * Ajoutez la méthode suivante qui termine proprement le serveur. Consultez la documentation de la classe "java.rmi.server.UnicastRemoteObject".
     * void goodbye() throws RemoteException;     * void goodbye() throws RemoteException;
 +  * Utilisez la methode //createRegistry(1099)// à la place de //getRegistry()//.
   * Modifiez le code du serveur pour qu'il instancie 2 objets distribués de type Hello, nommé "hello1" et "hello2". Modifiez le client pour qu'il utilise ces deux objets distants h1 et h2.   * Modifiez le code du serveur pour qu'il instancie 2 objets distribués de type Hello, nommé "hello1" et "hello2". Modifiez le client pour qu'il utilise ces deux objets distants h1 et h2.
   * Ajoutez maintenant la méthode suivante, qui manipule un objet de type Remote, par exemple Hello, pour effectuer l'appel h.sayHello() en cascade. En reprenant le code de la question précédente, il s'agit de réaliser l'appel client : //h1.sayRemote(h2)//.   * Ajoutez maintenant la méthode suivante, qui manipule un objet de type Remote, par exemple Hello, pour effectuer l'appel h.sayHello() en cascade. En reprenant le code de la question précédente, il s'agit de réaliser l'appel client : //h1.sayRemote(h2)//.
Line 129: Line 129:
 __Exercice__ :   __Exercice__ :  
   * Faire une proposition d'architecture en spécifiant le ou les interfaces. Faites la valider par l'enseignant avant de commencer l'implantation...   * Faire une proposition d'architecture en spécifiant le ou les interfaces. Faites la valider par l'enseignant avant de commencer l'implantation...
-  * Implantation. Utilisez les compléments Java fournis à la fin de cette page ;-)+  * Implantation. Utilisez les compléments Java disponibles [[sysrep:java|ici]] ;-) 
 +  * Quelques éléments de correction pour vous aider : [[sysrep:rmi-correction|ici]]
  
 +{{ sysrep:tp-rmi-chat.png?400 }}
 ====Generic Engine==== ====Generic Engine====
  
Line 161: Line 163:
 | EngineClient.java | x |   | | EngineClient.java | x |   |
  
-Pour mettre en oeuvre cette application, il faut que le client renseigne le serveur sur la localisation de la classe //MyTask.class// à l'aide d'un //codebase// (une extension du classpath) :  +Pour mettre en oeuvre cette application, il faut que le client renseigne le serveur sur la localisation de la classe //MyTask.class// à l'aide d'un //codebase// (une extension du classpath) : %%"-Djava.rmi.server.codebase=file:///dir/dir/classes/"%% ou %%"-Djava.rmi.server.codebase=http://www/classes/"%%De plus, pour que le serveur télécharge dynamiquement la classe MyTask fourni par le client, il faut donner des permissions supplémentaires au serveur en installant un //SecurityManager// :
-  * %%"-Djava.rmi.server.codebase=file:///dir/dir/classes/"%%  +
-  * %%"-Djava.rmi.server.codebase=http://www/classes/"%% +
- +
-De plus, pour que le serveur télécharge dynamiquement la classe MyTask fourni par le client, il faut donner des permissions supplémentaires au serveur en installant un //SecurityManager// :+
  
 <code java> <code java>
Line 180: Line 178:
 </code> </code>
  
-__Tutoriel__ http://docs.oracle.com/javase/tutorial/rmi/designing.html+En résumé, pour lancer votre application distribuée :
  
-====Compléments Java====+<code bash> 
 +# lancement serveur 
 +$ cd server 
 +$ ls  
 +  all.policy  Engine.java  EngineServer.java  Task.java 
 +$ rmiregistry &  # ou utiliser createRegistry() dans EngineServer 
 +$ java -Djava.security.policy=all.policy EngineServer
  
- +# lancement client 
-__Readline__ : Pour lire une chaîne de caractères sur la ligne de commande, il faut taper un truc comme ça : +$ cd client 
- +$ ls  
-<code java+  EngineClient.java  Engine.java  MyTask.java  Task.java 
-BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); +$ java -Djava.rmi.server.codebase=file:///$PWDEngineClient localhost # avec MyTask.class dans $PWD
-try { +
-  String msg = in.readLine(); +
-} catch(IOException e) { /* ... */ } +
-</code>     +
- +
-__StringTokenizer__ Pour décomposer une chaîne de caractères en mots (les //tokens//) : +
- +
-<code java> +
-StringTokenizer st = new StringTokenizer("this is a test"); +
-while (st.hasMoreTokens()) System.out.println(st.nextToken());+
 </code> </code>
  
-Affiche ici +__Tutoriel__ http://docs.oracle.com/javase/tutorial/rmi/designing.html 
 +====Fourmis====
  
-<nowiki> +FIXME : Ajouter un nouvel exo sur un programme Java simulant l'intelligence collective d'une colonie de fourmis : [[sysrep:rmi:ant | ici]].
-this +
-is +
-+
-test +
-</nowiki>     +
  
-__HashMap and Generics__ : Voici un petit exemple d'utilisation des Generics avec les HashMap.  
- 
-<code java> 
-HashMap<Integer,String> map = new HashMap<Integer,String>(); 
-map.put(1, "Ian"); 
-map.put(2, "Scott"); 
-String name = map.get(2) 
- 
-for (Integer key : map.keySet())   
-  System.out.println("key = " + key + ", value = " + map.get(key)); 
-</code>          
- 
-__Intrinsic Locks and Synchronization__ : En java chaque objet dispose d'un verrou intrinséque (mutex), qui est utile pour synchroniser l'accès au champs d'un objet via de multiple threads. Soit on déclare une méthode comme "synchronized", l'exclusion porte alors sur tout la méthode : 
- 
-<code java>      
-class FooBar { 
-  synchronized void foo() { ...} 
-  synchronized void bar() { ...} 
-} 
-</code> 
- 
-Soit on déclare un bloc de code "synchronized", en précisant explicitement l'objet qui fournit le lock. 
- 
-<code java> 
-Object lock = new Object; 
-synchronized(lock) {  
-  ... 
-  ... 
-} 
-</code> 
  
sysrep/rmi.1381304336.txt.gz · Last modified: 2024/03/18 15:05 (external edit)