一、RMI概述
RMI(Remote Method Invoke)-远程调用方法,是java的一组用户开发分布式应用程序的API。通过该RMI机制,可以实现程序组件在不同操作系统之间的通信。它是一种被EJB使用的更底层的协议,比如:一个EJB可以通过RMI调用Web上另一台机器上的EJB远程方法。
RMI使用了序列化方式在客户端和服务器端传递数据, 这样,我们就可以在远程方式下编写和使用对象,而不必知道它们实际上是远程的对象。
目标:
*无缝地支持在不同的Java虚拟机上的远程对象的使用。
*支持服务器到客户机的回调。
*用一种自然的方式在Java语言中集成分布对象模型,同时保持Java语言中的对象的主要语法
*使编写可靠的分布应用程序尽可能的简单。
*保持Java运行环境所提供的安全性。
二、RMI组成
一个正常工作的RMI系统由下面几个部分组成:
*远程服务的接口定义
*远程服务接口的具体实现
*桩(Stub)和框架(Skeleton)文件
*一个运行远程服务的服务器
*一个RMI命名服务,它允许客户端去发现这个远程服务
*类文件的提供者(一个HTTP或者FTP服务器)
*一个需要这个远程服务的客户端程序
三、原理示意图
方法调用从客户对象经占位程序(Stub)、远程引用层(RemoteReference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。
要完成以上步骤主要需要有以下几个步骤:
1、 生成一个远程接口
IHello.java代码如下:
import java.rmi.Remote; public interface IHello extends Remote { public String Hello(String name) throws java.rmi.RemoteException; }
2、 实现远程对象(服务器端程序)
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class HelloImpl extends UnicastRemoteObject implements IHello { // 这个实现必须有一个显式的构造函数,并且要抛出一个RemoteException异常 protected HelloImpl() throws RemoteException { super(); } /** * 说明清楚此属性的业务含义 */ private static final long serialVersionUID = 4077329331699640331L; public String Hello(String name) throws RemoteException { return "Hello " + name ; } public static void main(String[] args) { try { IHello hello = new HelloImpl(); java.rmi.Naming.rebind("rmi://******/hello", hello); //发布地址 System.out.print("Ready"); } catch (Exception e) { e.printStackTrace(); } } }
3、 生成占位程序和骨干网(服务器端程序)
4、 编写服务器程序
5、 编写客户程序
import java.rmi.Naming; public class Hello_RMI_Client { public static void main(String[] args) { try { IHello hello = (IHello) Naming.lookup("rmi://*******/hello"); //同服务端,发布地址 System.out.println(hello.Hello("杨晓敏")); } catch (Exception e) { e.printStackTrace(); } } }
6、 注册远程对象
7、 启动远程对象
四、优点
RMI以Java为核心,可与采用本机方法与现有系统相连接。这就是说,RMI可采用自然、直接和功能全面的方式为您提供分布式计算技术,而这种技术可帮助您以不断递增和无缝的方式为整个系统添加Java功能。
1、面向对象:RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。也就是说,可以将类似Java哈西表这样的复杂类型作为一个参数进行传递。
2、可移动属性:RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。
3、设计方式:对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。如果用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。所有面向对象的设计方式无不依靠不同的属性来发挥功能,如果不能传递完整的对象——包括实现和类型——就会失去设计方式上所提供的优点。
4、安全性:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。 RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全管理程序。
5、便于编写和使用:RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。
远程接口实际上就是Java接口。 为了实现RMI的功能必须创建远程对象任何可以被远程调用的对象必须实现远程接口。但远程接口本身并不包含任何方法。因而需要创建一个新的接口来扩展远程接口。新接口将包含所有可以远程调用的方法。远程对象必须实现这个新接口,由于新的接口扩展了远程接口,实现了新接口,就满足了远程对象对实现远程接口的要求,所实现的每个对象都将作为远程对象引用。
原文地址:http://blog.csdn.net/u010924897/article/details/45625955