关键词:RMI RPC CORBA
简 介:本篇文章重点阐述RMI,附带介绍RPC和CORBA
Java远程方法调用(Java RMI)是一组实现了远程方法调用(rmi)的API。
- java RMI是远程过程调用(RPC)的面向对象版等价概念,它还支持序列化的java类的直接转换以及分布式的垃圾回收(DGC)。
-
换句话说,java RMI是面向对象的远程调用,属于PRC的一种特例。
-
RMI的最初实现依赖于java虚拟机的类展现机制,故其只支持从一个JVM到另一个JVM的调用。底层协议只支持java实现就是java远程方法协议(JRMP)
- 为了支持运行在一个非JVM上下文的代码,开发人员后来开发了一个CORBA版本(javax.rmi.CORBA)
java1.2移除了skeleton对象
下面是一个java RMI的例子:
import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.rmi.registry.*; public class RmiServer extends UnicastRemoteObject implements RmiServerIntf { public static final String MESSAGE = "Hello World"; public RmiServer() throws RemoteException { super(0); // required to avoid the 'rmic' step, see below } public String getMessage() { return MESSAGE; } public static void main(String args[]) throws Exception { System.out.println("RMI server started"); try { //special exception handler for registry creation LocateRegistry.createRegistry(1099); //一个JVM可以创建一个记录器 System.out.println("java RMI registry created."); } catch (RemoteException e) { //do nothing, error means registry already exists System.out.println("java RMI registry already exists."); } //Instantiate RmiServer RmiServer obj = new RmiServer(); // Bind this object instance to the name "RmiServer" Naming.rebind("//localhost/RmiServer", obj);//通过Naming源码可知,rebind方法将RmiServer类型的对象记录到了本地记录器 System.out.println("PeerServer bound in registry"); } }
import java.rmi.Remote; import java.rmi.RemoteException; /** *这个接口需要提供给客户端,也就是提供服务getMessasge() */ public interface RmiServerIntf extends Remote { public String getMessage() throws RemoteException; }
import java.rmi.Naming; /** *这个就是客户端 */ public class RmiClient { public static void main(String args[]) throws Exception { //客户端运用了服务器暴露的接口,也叫stub(存根) RmiServerIntf obj = (RmiServerIntf)Naming.lookup("//localhost/RmiServer"); System.out.println(obj.getMessage()); } }
***stub,存根,这个词有点像会计学里的术语,想想坐公交、飞机,售票员总会留个底,你持有票据的另一半,这样双方就不会引起误会扯皮了。服务器提供的这个存根也是同理,就相当于一层协议,好让客户端请求服务器提供的服务。当然了,除了核心机制,计算机和现实的售票存在较大差异。
上面的例子,我是运行在了一台机器上,大家可以试试多台机器的远程调用,或者多个JVM之间进行调用。