"Salut ! Et un autre sujet heureux : RMI. RMI signifie Remote Method Invocation . En d'autres termes, RMI est un mécanisme qui permet à un objet d'une machine Java d'appeler des méthodes sur des objets d'une autre machine Java , même si elles se trouvent sur des machines différentes. ordinateurs, dans différents pays ou sur différents côtés du globe. »

IRM - 1

« Waouh ! Ça a l'air génial. »

"Ouais. Mais je vais seulement essayer de vous donner un aperçu. Avec ça, si vous creusez trop profondément, vous pouvez être confus par les nuances de la façon dont cela fonctionne."

"Mais si vous n'allez pas dans les extrêmes, alors RMI est non seulement très simple, mais il simplifie aussi grandement la vie d'un programmeur. Pour cela, nous lui rendons nos plus profonds respects."

"Nous voulons donc qu'un objet d'un programme Java appelle une méthode sur un objet qui se trouve dans un autre programme Java. Quel que soit l'endroit où ces programmes s'exécutent."

"Prenons l'exemple le plus simple : lorsque les deux programmes s'exécutent sur le même ordinateur.  Pour permettre aux programmes d'interagir sur Internet, vous devez configurer les autorisations de la JVM , mais nous n'aborderons pas cela aujourd'hui."

"En Java, vous ne pouvez appeler à distance que les méthodes des interfaces, pas les classes."

"Donc, nous avons deux programmes. Comment peuvent-ils s'appeler les méthodes de l'autre ?"

« Considérons la situation où un programme contient un objet et un second programme veut appeler des méthodes sur cet objet. Appelons le premier programme le serveur et le second le client .

"D'abord, je vais fournir un exemple de code, puis nous l'analyserons."

« Alors, que fera notre programme ? »

"Hmm. Eh bien, pour plus de simplicité, le programme aura une méthode qui inverse une chaîne qui lui est transmise."

"Assez simple."

« Bien, alors commençons : »

"Tout d'abord, nous avons besoin d'une interface qui réponde à nos exigences :"

Interface de communication entre programmes
interface Reverse extends Remote
{
 public String reverse(String str) throws RemoteException;
}

"J'ai créé une interface Reverse et y ai ajouté une interface de marqueur distant, ainsi qu'une RemoteException. Des erreurs inattendues peuvent se produire lors de l'appel de la méthode. Si c'est le cas, cette exception sera levée."

"Nous devons maintenant écrire une classe de serveur qui implémente cette interface :"

Classe pour le serveur
class ReverseImpl implements Reverse
{
 public String reverse(String str) throws RemoteException
 {
  return new StringBuffer(str).reverse().toString();
 }
}

"Je vois. Nous inversons la chaîne dans cette méthode."

"Ouais."

"Maintenant, nous devons rendre cet objet appelable à partir d'un autre programme. Voici comment procéder :"

Partage d'objets
public static final String UNIC_BINDING_NAME = "server.reverse";

public static void main(String[] args) throws Exception
{
 // Create an object to be accessible remotely.
 final ReverseImpl service = new ReverseImpl();

 // Create a registry of shared objects.
 final Registry registry = LocateRegistry.createRegistry(2099);
 // Create a stub for receiving remote calls.
 Remote stub = UnicastRemoteObject.exportObject(service, 0);
 // Register the stub in the registry.
 registry.bind(UNIC_BINDING_NAME, stub);

 // Put the main thread to sleep, or else the program will exit.
 Thread.sleep(Integer.MAX_VALUE);
}

"Je vais t'expliquer ligne par ligne."

" A la ligne 1 , nous stockons un nom unique (que nous avons composé) pour notre objet distant (objet accessible à distance) dans la variable  UNIC_BINDING_NAME . Si le programme rend plusieurs objets accessibles, chacun doit avoir son propre nom unique. Le notre le nom unique de l'objet est 'server.reverse'."

" A la ligne 6 nous créons un objet ReverseImpl qui sera accessible à distance. Ses méthodes seront invoquées."

" À la ligne 9 , nous créons un objet spécial appelé registre. Nous devons l'utiliser pour enregistrer les objets que nous partageons. La JVM interagira avec eux plus tard. 2099 est un port (un numéro unique qu'un autre programme peut utiliser pour accéder à notre registre d'objets)."

"En d'autres termes, pour accéder à un objet, vous devez connaître le numéro unique (port) du registre d'objets et le nom unique de l'objet, et avoir la même interface que celle implémentée par l'objet distant."

« Je vois. Quelque chose comme : appeler par téléphone (besoin d'un numéro) et demander Bill (le nom d'un objet) ?

"Oui. Maintenant, continuons."

" À la ligne 11  , nous créons un stub. Un stub est un objet spécial qui reçoit des informations sur l'appel distant, le décompresse, désérialise les arguments de la méthode et appelle la méthode requise. Ensuite, il sérialise le résultat ou l'exception, s'il y en a un , et renvoie le tout à l'appelant."

"Je vois. Presque. Vous avez dit qu'il 'désérialise les arguments de la méthode'. Donc, cela signifie que les arguments des méthodes distantes doivent être sérialisables ?"

"Oui. Sinon, comment les enverriez-vous sur le réseau ? Certes, il y a des exceptions, c'est-à-dire des objets qui sont passés par référence, mais nous n'en parlerons pas aujourd'hui."

"Nous allons le dire comme ceci : vous ne pouvez pas transmettre d'objets non sérialisables, mais si vous le voulez vraiment, vous le pouvez. Mais c'est pénible, vous savez."

"D'ACCORD."

"Alors continuons."

" A la ligne 13 , nous enregistrons le stub de notre objet sous un nom unique dans le registre."

" À la ligne 16 , nous mettons le thread principal en veille. Tous les appels distants sont traités sur des threads séparés. L'important est que le programme soit en cours d'exécution. Nous mettons donc simplement le thread principal en veille ici. C'est tout."

"D'ACCORD."

"Parfait, alors voici un exemple de client :"

Travailler avec un objet distant
public static final String UNIC_BINDING_NAME = "server.reverse";

public static void main(String[] args) throws Exception
{
 // Create a registry of shared objects
 final Registry registry = LocateRegistry.createRegistry(2099);

 // Get the object (actually, this is a proxy object)
 Reverse service = (Reverse) registry.lookup(UNIC_BINDING_NAME);

 // Call the remote method
 String result = service.reverse("Home sweet home.");
}

"Je vais vous expliquer ce code ligne par ligne :"

" La ligne 1 est le nom unique  de l'objet distant . Il doit être le même sur le client et le serveur."

" A la ligne 6  , on crée un " registre des objets distants ". Son port (2099) doit être le même que le port du registre de l'application serveur."

" A la ligne 9 , nous obtenons l' objet du registre. L'objet renvoyé est un objet proxy et est converti en une interface. L'interface doit hériter de l'interface du marqueur distant."

" A la ligne 12 , nous appelons les méthodes de l'interface comme si l'objet avait été créé dans le même programme. Il n'y a aucune différence."

« Cool ! Maintenant, je peux écrire des applications distribuées. Ou des jeux comme Battleship pour Android.

"N'ose pas, Amigo ! Le système d'exploitation Android a été interdit au 27e siècle après sa troisième tentative de conquête du monde. Les robots n'y ont absolument aucun accès. Il n'y aurait aucun moyen de vous en éloigner. . Vous commenceriez à courir partout en criant : « Tuez tous les humains ! »"

"Hmm. OK. Mais je dois quand même demander à Diego. On ne sait jamais, peut-être qu'il aura quelque chose d'intéressant à dire à ce sujet."

« Alors va lui demander. D'accord, eh bien, jusqu'à demain.

"Au revoir, Rishi. Merci pour cette leçon intéressante."