2011年(21)
分类: Java
2011-04-17 16:07:51
RMI原理及实现
简介
RMI是远程方法调用的简称,像其名称暗示的那样,它能够帮助我们查找并执行远程对象的方法。通俗地说,远程调用就象将一个class放在A机器上,然后在B机器中调用这个class的方法。
尽管RMI不是唯一的企业级远程对象访问方案,但它却是最容易实现的。与能够使不同编程语言开发的CORBA不同的是,RMI是一种纯Java解决方案。在RMI中,程
概念
在前面已经提到,RMI是一种远程方法调用机制,其过程对于最终用户是透明的:在进行现场演示时,如果我不说它使用了RNI,其他人不可能知道调用的方法存储在其他机器上。当然了,二台机器上必须都安装有Java虚拟机(JVM)。
其他机器需要调用的对象必须被导出到远程注册服务器,这样才能被其他机器调用。因此,如果机器A要调用机器B上的方法,则机器B必须将该对象导出到其远程注册服务器。注册服务器是服务器上运行的一种服务,它帮助客户端远程地查找和访问服务器上的对象。一个对象只有导出来后,才能实现RMI包中的远程接口。例如,如果想使机器A中的Xyz对象能够被远程调用,它就必须实现远程接口。
RMI需要使用占位程序和框架,占位程序在客户端,框架在服务器端。在调用远程方法时,我们无需直接面对存储有该方法的机器。
在进行数据通讯前,还必须做一些准备工作。占位程序就象客户端机器上的一个本机对象,它就象服务器上的对象的代理,向客户端提供能够被服务器调用的方法。然后,Stub就会向服务器端的Skeleton发送方法调用,Skeleton就会在服务器端执行接收到的方法。
Stub和Skeleton之间通过远程调用层进行相互通讯,远程调用层遵循TCP/IP协议收发数据。下面我们来大致了解一种称为为“绑定”的技术。
客户端无论何时要调用服务器端的对象,你可曾想过他是如何告诉服务器他想创建什么样的对象吗?这正是“绑定”的的用武之地。在服务器端,我们将一个字符串变量与一个对象联系在一起(可以通过方法来实现),客户端通过将那个字符串传递给服务器来告诉服务器它要创建的对象,这样服务器就可以准确地知道客户端需要使用哪一个对象了。所有这些字符串和对象都存储在的远程注册服务器中。
一个正常工作的RMI系统由下面几个部分组成:
ü 远程服务的接口定义
ü 远程服务接口的具体实现
ü Stub 和 Skeleton 文件
ü 一个运行远程服务的服务器
ü 一个RMI命名服务,它允许客户端去发现这个远程服务
ü 类文件的提供者(一个HTTP或者FTP服务器)
ü 一个需要这个远程服务的客户端程序
在编程中需要解决的问题
在研究代码之前,我们来看看必须编写哪些代码:
·远程对象:这个接口只定义了一个方法。我们应当明白的是,这个接口并非总是不包括方法的代码而只包括方法的定义。远程对象包含要导出的每个方法的定义,它还实现Java.rmi中的远程接口。
·远程对象实现:这是一个实现远程对象的类。如果实现了远程对象,就能够覆盖该对象中的所有方法,因此,远程对象的实现类将真正包含我们希望导出的方法的代码。
·远程服务器:这是一个作为服务器使用的类,它是相对于要访问远程方法的客户端而言的。它存储着绑定的字符串和对象。
·远程客户端:这是一个帮助我们访问远程方法提供帮助的类,它也是最终用户。我们将使用查找和调用远程方法的方法在该类中调用远程方法。
编程
(1)编写远程对象(AddServer.java),本质上它是一个接口;
(2)编写远程对象实现(AddServerImpl.java);
(3)用javac命令编译上面两个文件;
(4)用rmic编译器编译远程对象实现文件,以为创建stub和skeleton作准备;
命令:rmic rmi.AddServerImpl,生成AddServerImpl_Stub.class文件。如果是使用 Java2SDK,那么还可以发现AddServerImpl_Skel.class文件。
注:rmic命令中所给的类必须是经javac命令成功编译且是完全包限定的类。
(5)创建服务器(RmiServer.java);
调用Naming类的静态方法rebind方法将一个字符串变量与远程对象关联起来。
(6)创建客户端(RmiClient.java);
Naming类的lookup方法接受远程对象的完整的URL名字,该URL由完整的机器IP地址以及与对象绑定的字符串(也誻对象的绑定名)组成。在调用远程对象时,我们使用了RMI协议。lookup方法向我们返回一个对象,在能够使用它前,我们必须将它的数据类型转换为与远程对象的数据类型一致。
(7)编译上述两个文件;
(8)准备java安全策略文件;
在bin目录下新建一名为“mypolicy.txt”的文件。
因为RMI的安全机制将在服务端发生作用,所以必须增加一条安全策略。以下是对应安全策略的例子
grant {
permission java.security.AllPermission "", "";
};
注意:这是一条最简单的安全策略,它允许任何人做任何事,对于更加关键性的应用,必须指定更加详细安全策略。
(9)启动RMI Registry,为测试作准备。RMI Registry存储所有绑定的数据,没有它,RMI就不能正常运行。
命令:F:\workplace\rmi\bin>start rmiregistry //在.class文件所在的目录下启动。
出现一个空白的DOS提示符窗口,这表明Rmi Registry服务器在运行,注意不要关闭该窗口。
(10)启动RMI服务器。
命令:F:\workplace\rmi\bin>java -Djava.security.policy=mypolicy.txt rmi.RmiServer
(11)启动客户端验证RMI(在一个新的DOS窗口中)
命令:F:\workplace\rmi\bin>java rmi.RmiClient
源码见附件: