Java RMI(远程方法调用) 实例与分析

目的:

  通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出.

概念解释:

RMI(RemoteMethodInvocation):远程方法调用,顾名思义,通过远程的方式调用非本地对象的方法并返回结果。使用远程调用通常解决本地计算瓶颈问题,例如分布式记算,最近很火的阿尔法狗人机大战,据说运算使用上千个CPU。

JRMP(java remote method protocol):java远程方法协议,这是完成java到java远程调用的协议,基于TCP协议。

stub与skeleton:这两个概念下面会用到,这里解释下,skeleton是放在服务端的代理,它知道真正的对象在哪。stub是放在客户端的代理,它记录了查找和调用skeleton信息。理解成远程对象引用也成.

容易混淆的概念:

  远程方法调用与远程过程调用的区别:远程方法调用是java独有的,基于JRMP对象流协议实现,支持传输java序列化对象。远程过程调用是基于socket技术实现的,不能传输java对象,socket套接字协议支持多种语言。它们都是基于TCP协议传输。远程方法调用传输的是java序列化对象和基本数据类型,而远程过程调用不支持传输对象。

RMI调用模型:

aaarticlea/png;base64,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" alt="" />

从宏观看,想要远程调用需要做两件事情,1,服务端向本地对象注册表中注册能被调用的远程对象. 2,客户端向远程对象注册表请求远程对象的引用.

Java中RMI实现:

先通过一个例子了解Java中RMI是怎么用的,然后再根据代码分析源码是如何实现的.

1,先创建远程对象接口,继承自Remote(稍后源码中有分析为什么要有这个接口)

package remote.test;

import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* 远程接口,实现Remote
* @author lxz
*
*/
public interface IRemote extends Remote{ public String show()throws RemoteException;//声明方法
}

2,接口实现,需要继承UnicastRemoteObject类,等会分析

package remote.test;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; /**
* 远程接口实现,继承UnicastRemoteObject
* @author lxz
*
*/
public class RemoteImpl extends UnicastRemoteObject implements IRemote{
public RemoteImpl()throws RemoteException{}//构造方法
public String show()throws RemoteException{//调用方法实现
System.out.println("进入");
System.out.println(this.toString());
return "远程调用成功";
}
}

3,服务端向本地端口1234对象注册表注册对象和它的名字

package remote.test;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry; /**
* 服务端启动,创建端口上的对象注册列表,向对象注册表中注册远程调用对象
* @author lxz
*
*/
public class TestServer {
public static void main(String[] args) throws MalformedURLException, RemoteException, AlreadyBoundException, InterruptedException {
RemoteImpl r = new RemoteImpl();//创建远程对象
Registry rr = LocateRegistry.createRegistry(1234); //创建1234端口上的对象注册表,如果已经创建了就用getRegistry方法获取
rr.bind("testrmi", r);//向注册表中注册对象
System.out.println(r.toString());
}
}

4,根据JDK API,以上远程服务就算搭建完毕了,下面通过客户端调用测试

package remote.test;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException; /**
* 客户端启动,获得远程的对象注册表中的对象引用
* @author lxz
*
*/
public class TestClient { public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException {
IRemote r = (IRemote) Naming.lookup("rmi://localhost:1234/testrmi");//获取远程1234端口对象注册表中testrmi的stub
String a = r.show();//调用引用的方法,实际上调用的是stub,由stub与服务端交互并返回结果
System.out.println(a);
}
}

执行结果如下:

------------------------------------------

服务端:

RemoteImpl[UnicastServerRef [liveRef: [endpoint:[192.168.1.253:58169](local),objID:[-60651394:1539d5944e6:-7fff, -6910034932968554489]]]]
客户端:

远程调用成功
------------------------------------------

这样就完成了一个远程对象注册与远程对象方法调用的完整例子. 现在根据这个例子来分析它为什么要继承UnicastRemoteObject,实现Remote,向注册表注册等等.

首先远程对象实现类中需要继承UnicastRemoteObject类,UnicastRemoteObject具有注册为远程对象,生成远程引用的功能等,所有都已经被JDK封装好了,不需要编写,其中的实现有些是sun包开头的,不公开.

UnicastRemoteObject继承关系:

aaarticlea/png;base64,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" alt="" />

有了远程对象实现类,看服务端的启动逻辑,其中:

Registry rr = LocateRegistry.createRegistry(1234); 

LocateRegistry类:用于创建或获取某端口的对象注册表

LocateRegistry.createRegistry:这个方法表示获得远程对象注册表引用,返回Registry对象

Registry:真正操作远程对象注册表的接口

接着,

rr.bind("testrmi", r);

利用Registry的对象,把刚刚创建的远程对象注册为名称testrmi. 这里还有一种写法,效果是一样的.

LocateRegistry.createRegistry(1234); //创建,如果已经创建了就可省略这一句
Naming.bind("rmi://localhost:1234/testrmi", r);//需要带上端口

Naming:与对象注册表交互的工具类

上面是服务端从远程对象创建到对象注册的整个逻辑.客户端调用的逻辑比较简单,先通过Naming工具类获取到远程对象的引用以后,就可以正常使用了

(IRemote) Naming.lookup("rmi://localhost:1234/testrmi");

这里返回的"引用"和通常讲的对象引用不同,是远程对象的引用信息.拿到这个"引用"以后就可以像使用真正的对象一样调用其中的方法.

结束.

上一篇:【MySQL】查询不在表中的数据


下一篇:POJ 2777 Count Color (线段树成段更新+二进制思维)