RMI : Remote Method Invocation permet la communication entre machines virtuelles Java (JVM) qui peuvent se trouver physiquement sur la même machine ou sur deux machines distinctes ( espace d’adressage différents) . Un but primaire pour les concepteurs de RMI était de permettre à des programmeurs de développer des programmes distribués de Java avec la mêmes syntaxe et sémantique utilisées pour des programmes non-distribués. #Présentation RMI est un système d’objets distribués constitué uniquement d’objets java ; . RMI est une Application Programming Interface (intégrée au JDK 1.1 et plus) ; . Développé par JavaSoft ; #Objectifs Rendre transparent l’accès à des objets distribués sur un réseau Faciliter la mise en œuvre et l’utilisation d’objets distants Java Préserver la sécurité (inhérent à l’environnement Java) -RMISecurityManager -Distributed Garbage Collector (DGC) Exemple de code… public interface Calculator extends java.rmi.Remote { public long add(long a, long b) throws java.rmi.RemoteException; public long sub(long a, long b) throws java.rmi.RemoteException; public long mul(long a, long b) throws java.rmi.RemoteException; public long div(long a, long b) throws java.rmi.RemoteException; } ----------------------------------------------------public class CalculatorImpl extendsjava.rmi.server.UnicastRemoteObj ect implements Calculator { public CalculatorImpl() throws java.rmi.RemoteException { super(); } public long add(long a, long b) throws java.rmi.RemoteException { return a + b; } ----------------------------------------------------- ##Stub/ Skeleton Les amorces ( Stub/ Skeleton) .Elles assurent le rôle d’adaptateurs pour le transport des appels distants .El réalisen lé apel sur la couch réseau .Elles réalisent l’assemblage et le désassemblage des paramètres (marshalling, unmarshalling) .Les amorces sont créées par le générateur rmic. #Les Stubs . Représentants locaux 2l’objet distribué . Initient une connexion avec la JVM distante en transmettant l’invocation distante à la couche des références d’objets ; . Assemblent les paramètres pour leur transfert à la JVM distante ; . Attendent les résultats de l’invocation distante ; . Désassemblent la valeur ou l’exception renvoyée ; . Renvoient la valeur à l’appelant ; S’appuient sur la sérialisation. il les transforme en un flot de données (flux de pliage) transmissible sur le réseau les objet doivent implémenter l’interface java.io.Serializable ou java.io.Externalizable public long sub(long a, long b) throws java.rmi.RemoteException { return a - b; } public long mul(long a, long b) throws java.rmi.RemoteException { return a * b; } public long div(long a, long b) throws java.rmi.RemoteException { return a / b; } } --------------------------------------------------import java.rmi.Naming; public class CalculatorServer { public CalculatorServer() { try { Calculator c = new CalculatorImpl(); Naming.rebind("rmi://localhost:1099/CalculatorServi ce", c); } catch (Exception e) { System.out.println("Trouble: " + e); } } public static void main(String args[]) { new CalculatorServer(); } } ----------------------------------------------------- #Les squelettes . Désassemblent les paramètres pour la méthode distante ; . Font appel à la méthode demandée ; . Assemblage du résultat (valeur renvoyée ou exception) à destination de l.appelant. ---Client--import java.rmi.Naming; import java.rmi.RemoteException; import java.net.*; import java.rmi.NotBoundExceptio n; public class CalculatorClient { public static void main(String[] args) { try { Calculator c = (Calculator) Naming.lookup( "rmi://localhost /CalculatorService"); System.out.println( c.sub(4, 3) ); System.out.println( c.add(4, 5) ); System.out.println( c.mul(3, 6) ); System.out.println( c.div(9, 3) ); … …