Maison >Java >Javacommencer >Analyse des étapes d'appel à distance Java RMI
Jetons d'abord un coup d'œil à la définition de Java RMI :
RMI (Remote Method Invocation, invocation de méthode à distance) est implémenté dans JDK1.2 en utilisant grandement Java. améliore la capacité de Java à développer des applications distribuées. En tant que langage de développement réseau populaire, la grande puissance de Java se reflète dans sa puissante capacité à développer des applications réseau distribuées, et RMI est l'une des solutions de base pour développer des systèmes d'applications distribuées réseau Java 100 % purs. En fait, il peut être considéré comme la version Java de RPC. Mais le RPC traditionnel ne peut pas être correctement appliqué aux systèmes d'objets distribués. Java RMI prend en charge la communication entre les objets au niveau du programme stockés dans différents espaces d'adressage pour réaliser des appels à distance transparents entre des objets distants.
Étapes d'appel à distance RMI
Schéma d'interaction RMI :
RMI se compose de 3 parties, la première est rmiregistry (JDK fournit un programme qui peut être exécuté indépendamment (dans le répertoire bin), le second est un programme côté serveur qui fournit des objets distants au monde extérieur et le troisième est un programme côté client qui souhaite appeler des méthodes d'objets distants.
Tout d'abord, démarrez le service rmiregistry. Lors du démarrage, vous pouvez spécifier le port sur lequel le service écoute, ou vous pouvez utiliser le port par défaut (1099).
Deuxièmement, le côté serveur instancie d'abord une classe d'implémentation qui fournit des services localement, puis utilise la méthode de liaison ou de rebind de Naming/Context/Registry (Registry utilisé dans l'exemple ci-dessous) et d'autres classes fournies par RMI pour instancier l'implémentation. tout à l'heure La classe est enregistrée auprès de rmiregistry et exposée avec un nom.
Enfin, le client obtient la classe d'implémentation de RMIService via l'interface locale et un nom connu (c'est-à-dire le nom exposé par rmiregistry), puis utilise la méthode de recherche de Naming/Context/Registry et d'autres classes fournies par RMI. De cette façon, bien qu'il n'y ait pas de classe d'implémentation de cette classe localement, toutes les méthodes sont dans l'interface et la méthode de l'objet peut être appelée à distance.
Le processus de communication spécifique entre le stub et le réseau fédérateur :
Les appels de méthode depuis l'objet client via le stub et la référence distante couche (Remote Reference Layer) et la couche de transport (Transport Layer) vers le bas, transmises à l'hôte, puis à nouveau via la couche de transport, vers le haut via la couche d'appel distant et le réseau fédérateur (squelette), pour atteindre l'objet serveur.
Le stub agit comme un proxy pour l'objet du serveur distant, rendant cet objet disponible pour l'activation par les clients.
La couche de référence distante gère la sémantique, gère la communication d'objets uniques ou multiples et décide si l'appel doit être envoyé à un ou plusieurs serveurs.
La couche transport gère la connexion réelle et assure le suivi des objets distants pouvant accepter les appels de méthode.
Le réseau fédérateur termine l'appel de méthode réel à l'objet serveur et obtient la valeur de retour.
La valeur de retour est renvoyée au client via la couche de référence distante et la couche de transport côté serveur, puis renvoyée vers le haut via la couche de transport et la couche d'appel distant. Enfin, le stub obtient la valeur de retour.
Exemple simple JAVA RMI
Cet exemple est la méthode d'addition et de soustraction du client appelant l'objet distant côté serveur. Les étapes spécifiques sont :
Définir une interface distante
import java.rmi.Remote; import java.rmi.RemoteException; /** * 必须继承Remote接口。 * 所有参数和返回类型必须序列化(因为要网络传输)。 * 任意远程对象都必须实现此接口。 * 只有远程接口中指定的方法可以被调用。 */ public interface IRemoteMath extends Remote { // 所有方法必须抛出RemoteException public double add(double a, double b) throws RemoteException; public double subtract(double a, double b) throws RemoteException; }
(Partage vidéo d'apprentissage : Tutoriel vidéo Java)
2. Classe d'implémentation d'interface à distance
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import remote.IRemoteMath; /** * 服务器端实现远程接口。 * 必须继承UnicastRemoteObject,以允许JVM创建远程的存根/代理。 */ public class RemoteMath extends UnicastRemoteObject implements IRemoteMath { private int numberOfComputations; protected RemoteMath() throws RemoteException { numberOfComputations = 0; } @Override public double add(double a, double b) throws RemoteException { numberOfComputations++; System.out.println("Number of computations performed so far = " + numberOfComputations); return (a+b); } @Override public double subtract(double a, double b) throws RemoteException { numberOfComputations++; System.out.println("Number of computations performed so far = " + numberOfComputations); return (a-b); } }
Côté serveur
import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import remote.IRemoteMath; /** * 创建RemoteMath类的实例并在rmiregistry中注册。 */ public class RMIServer { public static void main(String[] args) { try { // 注册远程对象,向客户端提供远程对象服务。 // 远程对象是在远程服务上创建的,你无法确切地知道远程服务器上的对象的名称, // 但是,将远程对象注册到RMI Registry之后, // 客户端就可以通过RMI Registry请求到该远程服务对象的stub, // 利用stub代理就可以访问远程服务对象了。 IRemoteMath remoteMath = new RemoteMath(); LocateRegistry.createRegistry(1099); Registry registry = LocateRegistry.getRegistry(); registry.bind("Compute", remoteMath); System.out.println("Math server ready"); // 如果不想再让该对象被继续调用,使用下面一行 // UnicastRemoteObject.unexportObject(remoteMath, false); } catch (Exception e) { e.printStackTrace(); } } }4. Client Le résultat de fin
import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import remote.IRemoteMath; public class MathClient { public static void main(String[] args) { try { // 如果RMI Registry就在本地机器上,URL就是:rmi://localhost:1099/hello // 否则,URL就是:rmi://RMIService_IP:1099/hello Registry registry = LocateRegistry.getRegistry("localhost"); // 从Registry中检索远程对象的存根/代理 IRemoteMath remoteMath = (IRemoteMath)registry.lookup("Compute"); // 调用远程对象的方法 double addResult = remoteMath.add(5.0, 3.0); System.out.println("5.0 + 3.0 = " + addResult); double subResult = remoteMath.subtract(5.0, 3.0); System.out.println("5.0 - 3.0 = " + subResult); }catch(Exception e) { e.printStackTrace(); } } }est le suivant : fin du serveur fin du client Référence :
https://blog.csdn.net/xinghun_4/article/details/45787549
Recommandations associées :Tutoriel d'introduction à Java
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!