Maison >Java >JavaBase >Explication graphique détaillée de Java RMI (avec exemples)

Explication graphique détaillée de Java RMI (avec exemples)

尚
avant
2019-12-24 17:33:296027parcourir

Explication graphique détaillée de Java RMI (avec exemples)

Java RMI : Java Remote Method Invocation, ou Java RMI (Java Remote Method Invocation), est une interface de programmation d'application utilisée pour implémenter des appels de procédure à distance dans le langage de programmation Java.

Il permet aux programmes exécutés sur le client d'appeler des objets sur le serveur distant. La fonctionnalité d'invocation de méthode à distance permet aux programmeurs Java de distribuer des opérations dans un environnement réseau. L'objectif principal de RMI est de simplifier autant que possible l'utilisation des objets d'interface distants.

Nous savons que l'appel de procédure distante (RPC) peut être utilisé par un processus pour appeler un processus dans un autre processus (probablement sur un autre hôte distant), fournissant ainsi des capacités de distribution de processus. Le RMI de Java fait un pas de plus en s'appuyant sur RPC, en assurant la communication entre les objets distribués.

RMI (Remote Method Invocation) est une invocation de méthode à distance, qui permet à un objet exécuté sur une machine virtuelle Java d'appeler une méthode sur un objet exécuté sur une autre machine virtuelle Java.

Les deux machines virtuelles peuvent s'exécuter dans des processus différents sur le même ordinateur, ou elles peuvent s'exécuter sur des ordinateurs différents du réseau.

[JavaRMI]

1. Principe de fonctionnement

RMI permet à un programme Java d'appeler un autre ordinateur du réseau. méthode de l'objet Java de l'ordinateur, l'effet de son appel est le même que celui de son appel sur la machine locale. En termes simples : il existe une classe sur la machine A et, via un appel à distance, la machine B appelle les méthodes de cette classe.

RMI, Remote Method Invocation (Remote Method Invocation) est l'épine dorsale des Enterprise JavaBeans et un moyen pratique de créer des applications Java distribuées. RMI est très simple à utiliser, mais il est très puissant.

Le fondement de RMI est l'interface. L'architecture RMI repose sur un principe important : la définition de l'interface et la définition de l'implémentation spécifique de l'interface sont distinctes. Ci-dessous, nous utilisons des exemples spécifiques pour créer un service informatique à distance simple et un programme client qui l'utilise

2. RMI comprend :

Définition de l'interface de service à distance

2. Implémentation spécifique de l'interface de service distant

3. Fichiers Stub et Skeleton

4. Un serveur exécutant un service distant

5. qui permet aux clients de découvrir le service distant

6. Un fournisseur de fichiers de classe (un serveur HTTP ou FTP)

7 Celui qui nécessite ce programme client de service distant

.

3. Quel est le but de RMI ?

Le but de RMI est de fournir des services de communication à distance entre des applications Java distribuées et de fournir un service de distribution.

À l'heure actuelle, les principales applications sont encapsulées dans divers frameworks de projets J2EE, tels que Spring, EJB (Spring et EJB encapsulent la technologie RMI)

Implémenter RMI au Spring :

① Définir les interfaces de service côté serveur et définir des classes spécifiques pour implémenter ces interfaces

② Utiliser la classe org.springframework.remoting.rmi.RmiServiceExporter côté serveur pour enregistrer les services ; >③ Dans Le client utilise org.springframework.remoting.rmi.RmiProxyFactoryBean pour implémenter la fonction proxy du service distant

④ Définir une classe sur le client qui accède à la même interface de service que le serveur

IV , Quelles sont les limites du RMI ?                                                            JRMP est un protocole spécialement développé pour les objets distants Java. Étant donné que JRMP est spécialement développé pour les objets Java, RMI ne prend pas suffisamment en charge les systèmes d'application développés dans des langages non Java.

Impossible de communiquer avec des objets écrits dans des langages non Java (ce qui signifie que seuls les appels de code à distance où le client et le serveur sont des programmes Java sont pris en charge).

5. Quelles sont les limites de RMI ?

Étant donné que le client et le serveur sont écrits en Java, l'exigence de compatibilité de la plate-forme est que les deux parties fonctionnent sur version de machine virtuelle Java compatible.

6. Paramètres et valeurs de retour des appels RMI aux méthodes distantes

Lors de l'appel de méthodes sur des objets distants, le client peut non seulement utiliser les données de type original comme paramètres De plus, les objets peuvent également être transmis en tant que paramètres, correspondant à la valeur de retour, qui peuvent renvoyer des types primitifs ou des objets. Ceux-ci sont tous implémentés via la technologie de sérialisation d'objets (sérialisation) de Java. (En d'autres termes : si le paramètre ou la valeur de retour est un objet, il doit implémenter l'interface Serialisable)

7. Modèle de base de l'application RMI

.

8. Architecture RMI

Explication graphique détaillée de Java RMI (avec exemples)

Couche Stub/Squelette : stub côté client et framework côté serveur ;

Couche de référence distante : Gestion du comportement de référence distante

Couche de transport : Établissement et gestion des connexions, et suivi des objets distants

Classes et interfaces RMI (classes nécessaires à remplir un RMI simple).

Explication graphique détaillée de Java RMI (avec exemples)

(1) Interface distante : C'est une interface marquée qui ne définit pas de méthodes

Interface publique distante{}

in Dans RMI, l'interface distante déclare l'ensemble des méthodes pouvant être appelées depuis la machine virtuelle Java distante. L'interface distante répond aux exigences suivantes :

1. L'interface distante doit étendre directement ou indirectement l'interface Java.rmi.Remote et doit être déclarée publique, sauf si le client et l'interface distante sont dans le même package.

2. Lors de la déclaration d'une méthode dans une interface distante, en plus d'en lancer une liée à l'application, elle doit également inclure une exception RemoteException (ou sa superclasse, IOExcepion ou Exception)

3 . Dans une déclaration de méthode distante, un objet distant déclaré comme paramètre ou valeur de retour doit être déclaré comme interface distante, et non comme classe d'implémentation de l'interface.

(2) La classe abstraite RemoteObject implémente l'interface Remote et l'interface Serialisable Elle et ses sous-classes fournissent des fonctions de serveur RMI.

(3) La classe LocateRegistry final() est utilisée pour obtenir une référence au programme du serveur d'enregistrement d'objets à distance de démarrage d'un hôte spécifique (c'est-à-dire créer un stub) ou pour créer un service d'enregistrement d'objets à distance programme qui peut recevoir des appels sur un port spécifique.

Côté serveur : fournir des services d'objets distants à d'autres clients

SomeService servcie=……;//远程对象服务

1. Registry Registry=LocateRegisty.getRegistry(); //Registry est une interface, il hérite de Remote, cette méthode renvoie le local. référence de l'hôte au registre d'objets distants sur le port de registre par défaut 1099.

2. getRegistry(int port) renvoie la référence de l'hôte local au registre d'objet distant sur le port spécifié ;

3. getRegistry(String host) renvoie l'hôte spécifié sur le port par défaut. port de registre 1099 Référence au registre de l'objet distant ;

4. getRegistry(String host, int port) renvoie une référence au registre de l'objet distant sur l'hôte et le port spécifiés

5. bind("I serve",service);//bind(String name,Remote obj) Lie la référence distante au nom spécifié dans ce registre. name : le nom lié à la référence distante obj : une référence à l'objet distant (généralement un stub)

6. unbind (String name) supprime la liaison du nom spécifié dans le registre.

7. rebind (String name, Remote obj). Si le nom existe déjà mais que la télécommande est différente, remplacez-la. Si la télécommande est la même, supprimez la liaison existante. . lookup(String name) Renvoie la référence distante liée au nom spécifié dans le registre, renvoie Remote

9, String[] list() Renvoie un tableau de noms liés dans ce registre. Ce tableau contiendra un instantané des noms de ce registre qui étaient liés lorsque cette méthode a été appelée.

Client : fournissez les demandes de service correspondantes au serveur.

Registry Registry=LocateRegisty.getRegistry();

SomeService servcie=(SomeService)registry.lookup(“Je sers”);

Servcie.requestService();


(4) La classe de nommage est similaire à la classe de registre.

Client :

Naming.lookup(String url)
url 格式如下"rmi://localhost/"+远程对象引用

Serveur :

Registry registry=LocateRegistry.createRegistry(int port);
Naming.rebind(“service”,service);

(5) Classe RMISecurityManager

Dans le programme de référence RMI, si aucun gestionnaire de sécurité n'est défini, alors les stubs et les classes ne peuvent être chargées qu'à partir du chemin de classe local, ce qui garantit que l'application n'est pas compromise par du code téléchargé par des appels de méthode distants

Le code suivant doit être exécuté pour installer RMISecurityManager avant de télécharger le code depuis l'hôte distant :

System.setSecurityManager(new RMISEcurityManager());

10 Développement de démo

Afin d'écrire une démo, nous sommes divisés en deux parties. , une partie est Une partie du code côté serveur est le code côté client. Le code côté client est principalement destiné à utiliser le code côté serveur. Bien sûr, ce code est très simple, juste pour illustrer le problème, l'utilisation réelle sera plus compliquée.

(1) Notre objectif

Créer un projet Java côté serveur, y compris le code côté distant, définir l'interface, définir l'implémentation de l'interface, puis créer un projet Java côté client pour utiliser le côté distant via les méthodes RMI dans les services finaux.

(2) Notre structure de code

Explication graphique détaillée de Java RMI (avec exemples)(3) Code de service à distance

1. Définition de l'interface de service à distance

La première étape consiste à créer et compiler le code Java de l'interface de service. Cette interface définit toutes les fonctions permettant de fournir des services à distance. Voici le programme source :

UserManagerInterface.java

package cn.com.tt.rmiserver.stub;

import java.rmi.Remote;
import java.rmi.RemoteException;

import cn.com.tt.rmiserver.bean.Account;

public interface UserManagerInterface extends Remote{
    public String getUserName() throws RemoteException;
    public Account getAdminAccount() throws RemoteException;
}

L'interface doit hériter de la classe Remote et chaque méthode définie doit lever une exception RemoteException. . objet.

2. Implémentation spécifique de l'interface

La deuxième étape consiste à implémenter l'interface ci-dessus :

UserManagerImp.java

package cn.com.tt.rmiserver;

import java.rmi.RemoteException;

import cn.com.tt.rmiserver.stub.UserManagerInterface;
import cn.com.tt.rmiserver.bean.Account;

public class UserManagerImp implements UserManagerInterface {
    public UserManagerImp() throws RemoteException {

    }
    private static final long serialVersionUID = -3111492742628447261L;

    public String getUserName() throws RemoteException{
        return "TT";
    }
    public Account getAdminAccount() throws RemoteException{
        Account account=new Account();
        account.setUsername("TT");
        account.setPassword("123456");
        return account;
    }
}

3. , implémente l'interface de sérialisation sérialisable . C'est-à-dire un objet sérialisable qui peut être transmis entre le client et le serveur.

Account.java

package cn.com.tt.rmiserver.bean;

import java.io.Serializable;

public class Account implements Serializable,Cloneable{
    private static final long serialVersionUID = -1858518369668584532L;
    private String username;
    private String password;
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

4. Définissez l'entrée principale du programme côté serveur.

Entry.java

package cn.com.tt.rmiserver.entry;

import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

import cn.com.tt.rmiserver.UserManagerImp;
import cn.com.tt.rmiserver.stub.UserManagerInterface;

public class Entry {
    public static void main(String []args) throws AlreadyBoundException, RemoteException{
        UserManagerImp userManager=new UserManagerImp();
        UserManagerInterface userManagerI=(UserManagerInterface)UnicastRemoteObject.exportObject(userManager,0);
        // Bind the remote object's stub in the registry
        Registry registry = LocateRegistry.createRegistry(2002);
       
        registry.rebind("userManager", userManagerI);
        System.out.println("server is ready");
        }
}

(4) code client

1、把Server端的Account类和接口UserManagerInterface 导出Export成jar包,命名为:RmiServerInterface.jar。导入到client中。

2、项目——右键——Export——java——jar file——next——选择Account类和接口UserManagerInterface——命名为:RmiServerInterface.jar如下图:

Explication graphique détaillée de Java RMI (avec exemples)

3. 新建一个java Project,导入jar包,编写客户端代码。

4. 代码

ClientEntry.java

package weiblog.rmi;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import cn.com.tt.rmiserver.stub.UserManagerInterface;

public class ClientEntry {
    
    public static void main(String []args){
        
        try {
            Registry registry = LocateRegistry.getRegistry("localhost",2004);
            UserManagerInterface userManager = (UserManagerInterface)registry.lookup("userManager");
            System.out.println("用户名是"+userManager.getAdminAccount().getUsername()
                    +"密码"+userManager.getAdminAccount().getPassword());
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NotBoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

}

5. 先运行服务器端代码, 然后运行客户端代码,就会显示运行结果,客户端可以运行多次,每次都可以取得服务器端的对象。如果要再次运行客户端代码就需要更改端口号,如果不更改就会显示端口号被占用。

更多java知识请关注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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer