Werfen wir zunächst einen Blick auf die Definition von Java RMI:
RMI (Remote Method Invocation, Remote-Methodenaufruf) wird in JDK1.2 mithilfe von Java implementiert, was die Fähigkeit von Java zur Entwicklung verteilter Anwendungen erheblich verbessert. Als beliebte Netzwerkentwicklungssprache spiegelt sich die große Leistungsfähigkeit von Java in seiner leistungsstarken Fähigkeit zur Entwicklung verteilter Netzwerkanwendungen wider. RMI ist eine der Kernlösungen für die Entwicklung von 100 % reinen Java-Netzwerkanwendungssystemen. Tatsächlich kann es als Java-Version von RPC betrachtet werden. Traditionelles RPC lässt sich jedoch nicht gut auf verteilte Objektsysteme anwenden. Java RMI unterstützt die Kommunikation zwischen Objekten auf Programmebene, die in verschiedenen Adressräumen gespeichert sind, um nahtlose Remote-Aufrufe zwischen Remote-Objekten zu erreichen.
RMI-Fernaufrufschritte
RMI-Interaktionsdiagramm:
RMI besteht aus drei Teilen: Der erste ist rmiregistry (ein von JDK bereitgestelltes Programm, das unabhängig im Bin-Verzeichnis ausgeführt werden kann), der zweite ist ein Server -seitiges Programm, das Remote-Objekte für die Außenwelt bereitstellt, und das dritte ist ein clientseitiges Programm, das Methoden von Remote-Objekten aufrufen möchte.
Starten Sie zunächst den rmiregistry-Dienst. Beim Start können Sie den Port angeben, auf dem der Dienst lauscht, oder Sie können den Standardport (1099) verwenden.
Zweitens instanziiert die Serverseite zunächst eine Implementierungsklasse, die lokal Dienste bereitstellt, und registriert dann die soeben instanziierte Implementierungsklasse über die Bindungs- oder Rebind-Methode von Naming/Context/Registry (im Beispiel unten wird die Registrierung verwendet) und andere von RMI bereitgestellte Klassen . Gehen Sie zu rmiregistry und geben Sie der Außenwelt einen Namen bekannt.
Schließlich verwendet der Client die lokale Schnittstelle und einen bekannten Namen (d. h. den von rmiregistry bereitgestellten Namen) und verwendet dann die Suchmethode der von RMI bereitgestellten Naming/Context/Registry-Klasse, um die Implementierungsklasse von RMIService abzurufen. Obwohl es lokal keine Implementierungsklasse dieser Klasse gibt, befinden sich auf diese Weise alle Methoden in der Schnittstelle, und die Methode des Objekts kann remote aufgerufen werden.
Der spezifische Kommunikationsprozess zwischen dem Stub und dem Backbone-Netzwerk:
Der Methodenaufruf wird vom Clientobjekt über den Stub, die Remote-Referenzschicht (Remote Reference Layer) und die Transportschicht (Transport Layer) an den Host übergeben ). Dann durchläuft es erneut die Transportschicht, die Remote-Call-Schicht und das Backbone-Netzwerk (Skeleton) und erreicht das Serverobjekt.
Der Stub fungiert als Proxy für das Remote-Server-Objekt und stellt das Objekt für die Aktivierung durch Clients zur Verfügung.
Die Remote-Referenzschicht kümmert sich um die Semantik, verwaltet die Kommunikation einzelner oder mehrerer Objekte und entscheidet, ob Aufrufe an einen oder mehrere Server gesendet werden sollen.
Die Transportschicht verwaltet die eigentliche Verbindung und verfolgt entfernte Objekte, die Methodenaufrufe akzeptieren können.
Das Backbone-Netzwerk schließt den eigentlichen Methodenaufruf für das Serverobjekt ab und erhält den Rückgabewert.
Der Rückgabewert wird über die Remote-Referenzschicht und die serverseitige Transportschicht an den Client zurückgegeben und dann über die Transportschicht und die Remote-Aufrufschicht nach oben zurückgegeben. Schließlich erhält der Stub den Rückgabewert.
Einfaches JAVA RMI-Beispiel
Dieses Beispiel zeigt die Additions- und Subtraktionsmethode des serverseitigen Remote-Objekts. Die spezifischen Schritte sind:
1. Definieren Sie eine Remote-Schnittstelle
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; }
(Lernvideofreigabe: Java-Video Tutorial
2. Remote-Schnittstellen-Implementierungsklasseimport 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); } }
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(); } } }
Client-Seite
Referenz:
https:// blog.csdn.net/xinghun_4/article/details/45787549Verwandte Empfehlungen:Das obige ist der detaillierte Inhalt vonAnalyse der Java RMI-Remote-Aufrufschritte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!