【Dongle】【Java】规范之RMI

RMI

     RMI(Remote Method Invoke):remote(遥远的) invoke(调用),正如其名字所表示的那样,RMI协议调用远程对象上方法。它使用了序列化方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更底层的协议,能够让在某个Java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法。


系统组成

        一个正常工作的RMI系统由下面几个部分组成:

  • 远程服务的接口定义
  • 远程服务接口的具体实现
  • 桩(Stub)和框架(Skeleton)文件
  • 一个运行远程服务的服务器
  • 一个RMI命名服务,它允许客户端去发现这个远程服务
  • 类文件的提供者(一个HTTP或者FTP服务器)
  • 一个需要这个远程服务的客户端程序

系统准备

1、生成一个远程接口

2、实现远程对象(服务器端程序)

3、生成占位程序和骨干网(服务器端程序)

4、编写服务器程序

5、编写客户程序

6、注册远程对象

7、启动远程对象


运行机理

       RMI应用程序通常包括两个独立的程序:服务器程序和客户机程序。典型的服务器应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户机调用这些远程对象的方法。而典型的客户机程序则从服务器中得到一个或多个远程对象的引用,然后调用远程对象的方法。RMI为服务器和客户机进行通信和信息传递提供了一种机制。在与远程对象的通信过程中,RMI使用标准机制:stub和skeleton。stub和skeleton由rmic编译器生成。

stub

        在RMI中,远程对象的stub与该远程对象所实现的远程接口集相同。每个远程对象都包含一个代理对象stub,当运行在本地Java虚拟机上的程序调用运行在远程Java虚拟机上的对象方法时,它首先在本地创建该对象的代理对象stub, 然后调用代理对象上匹配的方法,代理对象会作如下工作:

(1) 初始化与包含远程对象的远程虚拟机的连接;

(2) 对远程虚拟机的参数进行编组(写入并传输);

(3) 等待方法调用结果;

(4) 解编(读取)返回值或返回的异常;

(5) 将值返回给调用程序。


        stub 对象负责调用参数和返回值的流化(serialization)、打包解包,以及网络层的通讯过程。

Skeleton

       为了向调用程序展示比较简单的调用机制,stub将参数的序列化和网络级通信等细节隐藏了起来。在远程虚拟机中,每个远程对象都可以有相应的skeleton。Skeleton负责将调用分配给实际的远程对象实现。它在接收方法调用时执行下列操作:

(1) 解编(读取)远程方法的参数;

(2) 调用实际远程对象实现上的方法;

(3) 将结果(返回值或异常)编组(写入并传输)给调用程序。

 

工作

        (1) 定位远程对象。

               应用程序可使用两种机制中的一种得到对远程对象的引用。它既可用RMI的简单命名工具rmiregistry来注册它的远程对象,也可以将远程对象引用作为常规操作的一部分来进行传递和返回。

      (2)与远程对象通信。

               远程对象间通信的细节由RMI处理,对于程序员来说,远程通信看起来就像标准的Java方法调用。

      (3)给作为参数或返回值传递的对象加载类字节码。

               因为RMI允许调用程序将纯Java对象传给远程对象,所以,RMI将提供必要的机制,既可以加载对象的代码又可以传输对象的数据。在RMI分布式应用程序运行时,服务器调用注册服务程序以使名字与远程对象相关联。客户机在服务器上的注册服务程序中用远程对象的名字查找该远程对象,然后调用它的方法。


主要优点

       面向对象:RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。也就是说,您可以将类似Java哈希表这样的复杂类型作为一个参数进行传递。

       可移植:RMI可将属性(类实现程序)从客户机移动到服务器,或者从服务器移到客户机。

       设计方式:对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。

       安 全:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。RMI使用专门为保护系统免遭恶意小应用程序侵害而设计的安全管理程序,可保护您的系统和网络免遭潜在的恶意下载程序的破坏。在情况严重时,服务器可拒绝下载任何执行程序。

       便于编写和使用:RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。远程接口实际上就是Java接口。

        可连接现有/原有的系统:RMI可通过Java的本机方法接口JNI与现有系统进行进行交互。

        编写一次,到处运行:RMI是Java“编写一次,到处运行”方法的一部分。任何基于RMI的系统均可100%地移植到任何Java虚拟机上,RMI/JDBC系统也不例外。

        分布式垃圾收集:RMI采用其分布式垃圾收集功能收集不再被网络中任何客户程序所引用的远程服务对象。

        并行计算:RMI采用多线程处理方法,可使您的服务器利用这些Java线程更好地并行处理客户端的请求。


远程调用

1、客户对象调用客户端辅助对象上的方法

2,客户端辅助对象打包调用信息(变量,方法名),通过网络发送给服务端辅助对象

3,服务端辅助对象将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在对象

4,调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象

5,服务端辅助对象将结果打包,发送给客户端辅助对象

6,客户端辅助对象将返回值解包,返回给客户对象

7,客户对象获得返回值


        对于客户对象来说,步骤2-6是完全透明的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值