Java RMI bezieht sich auf Remote Method Invocation. Dabei handelt es sich um einen Mechanismus, der es einem Objekt in einer Java Virtual Machine ermöglicht, Methoden für ein Objekt in einer anderen Java Virtual Machine aufzurufen. Jedes Objekt, das mit dieser Methode aufgerufen werden kann, muss die Remote-Schnittstelle implementieren. (Empfohlen: Java-Video-Tutorial)
Java RMI ist keine neue Technologie (sie war in der Ära von Java 1.1 verfügbar), aber es ist eine sehr wichtige zugrunde liegende Technologie.
Die berühmten EJBs basieren alle auf RMI. Es gibt auch einige Open-Source-Remote-Calling-Komponenten, und ihre zugrunde liegende Technologie ist ebenfalls RMI.
Sollte im Zeitalter der energischen Befürwortung von Webdiensten und SOA jede Anwendung mit schwerfälligen Webdienstkomponenten implementiert werden? Nach Vergleichstests ist RMI für einige kleine Anwendungen am besten geeignet.
Im Folgenden wird ein einfaches Beispiel verwendet, um die Prinzipien und Anwendungen von RMI zu veranschaulichen. Das folgende Beispiel ist ein einfaches HelloWorld, deckt jedoch die Kernanwendungen und Entwicklungsmodelle von RMI ab.
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 21:50:02 * 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常 */ public interface IHello extends Remote { /** * 简单的返回“Hello World!"字样 * @return 返回“Hello World!"字样 * @throws java.rmi.RemoteException */ public String helloWorld() throws RemoteException; /** * 一个简单的业务方法,根据传入的人名返回相应的问候语 * @param someBodyName 人名 * @return 返回相应的问候语 * @throws java.rmi.RemoteException */ public String sayHelloToSomeBody(String someBodyName) throws RemoteException; }
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 21:56:47 * 远程的接口的实现 */ public class HelloImpl extends UnicastRemoteObject implements IHello { /** * 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常 * * @throws RemoteException */ public HelloImpl() throws RemoteException { } /** * 简单的返回“Hello World!"字样 * * @return 返回“Hello World!"字样 * @throws java.rmi.RemoteException */ public String helloWorld() throws RemoteException { return "Hello World!"; } /** * 一个简单的业务方法,根据传入的人名返回相应的问候语 * * @param someBodyName 人名 * @return 返回相应的问候语 * @throws java.rmi.RemoteException */ public String sayHelloToSomeBody(String someBodyName) throws RemoteException { return "你好," + someBodyName + "!"; } }
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 22:03:35 * 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。 */ public class HelloServer { public static void main(String args[]) { try { //创建一个远程对象 IHello rhello = new HelloImpl(); //本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上 LocateRegistry.createRegistry(8888); //把远程对象注册到RMI注册服务器上,并命名为RHello //绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的) Naming.bind("rmi://localhost:8888/RHello",rhello); // Naming.bind("//localhost:8888/RHello",rhello); System.out.println(">>>>>INFO:远程IHello对象绑定成功!"); } catch (RemoteException e) { System.out.println("创建远程对象发生异常!"); e.printStackTrace(); } catch (AlreadyBoundException e) { System.out.println("发生重复绑定对象异常!"); e.printStackTrace(); } catch (MalformedURLException e) { System.out.println("发生URL畸形异常!"); e.printStackTrace(); } } }
/** * Created by IntelliJ IDEA. * User: leizhimin * Date: 2008-8-7 22:21:07 * 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。 */ public class HelloClient { public static void main(String args[]){ try { //在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法 IHello rhello =(IHello) Naming.lookup("rmi://localhost:8888/RHello"); System.out.println(rhello.helloWorld()); System.out.println(rhello.sayHelloToSomeBody("熔岩")); } catch (NotBoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } }
Führen Sie das RMI-Serverprogramm aus:
Führen Sie das RMI-Clientprogramm aus:
Zusammenfassung :
Aus dem oben genannten Prozess ist RMI stark von der IP-Adresse und dem Port des Servers abhängig. Wir wissen jedoch nicht, wie die zukünftige Server-IP und der Port aussehen werden, aber das Client-Programm hängt davon ab auf dieser IP und diesem Port.
Dies ist auch eine der Einschränkungen von RMI. Es gibt zwei Möglichkeiten, dieses Problem zu lösen: Eine besteht darin, es über DNS zu lösen, und die andere darin, die IP durch Kapselung außerhalb des Programmcodes offenzulegen.
Die zweite Einschränkung von RMI besteht darin, dass RMI ein Remote-Aufruf in der Java-Sprache ist. Die Programmiersprache an beiden Enden muss in Java implementiert sein. Für die Kommunikation zwischen verschiedenen Sprachen können Sie die Verwendung von Web Service oder Common Object Request in Betracht ziehen Agentur (CORBA).
Weitere Java-Kenntnisse finden Sie in der Spalte Java Basic Tutorial.
Das obige ist der detaillierte Inhalt vonEinführung in Java RMI (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!