远程方法调用(RMI)是一个类似于RPC的Java特性。

RMI允许线程调用远程对象的方法。如果对象位于不用的JVM上,那么就认为它是远程的。因此,远程可能在同一计算机或者通过网络连接的主机的不同JVM上。

如图:

RMI和RPC在两方面有着根本的不同

  • 第一,RPC支持子程序编程,即只能调用远程的子程序或者函数;而RMI是基于对象的,它支持调用远程对象的方法
  • 第二,在RPC中,远程过程的参数是普通数据结构,而RMI可以将对象作为参数传递给远程方法

RMI通过允许Java程序调用远程对象的方法,使得用户能够开发分布在网络上的Java应用程序。

为了使远程方法对客户机和服务器透明,RMI采用存根(stub)和骨干(skeleton)实现远程对象。

存根为远程对象的代理,它驻留在客户机中。当客户机调用远程方法时,远程对象的存根被调用。这种客户端存根则创建一个包,它具有服务器上主要调用方法的名称和用于该方法 的编排参数。存根将该包发送给服务器,远程对象的骨干会接收它。骨干负责重新编排参数并调用服务器上所需执行的方法。骨干接着编排返回值(或者是异常),然后打包,并将该包返回给客户机。存根重新编排返回值,并传递给客户机。

假设客户机希望调用远程对象server的一someMethod(Object,Object),返回值是布尔值。客户机执行如下语句:

boolean val = server.someMethod(A,B);

使用参数A,B的someMethod()调用了远程对象的存根。存根将参数A,B以及要在服务器上执行的方法名称一起打包,接着讲包发送给服务器。

服务器上的骨干会重新编排参数并调用方法someMethod()。someMethod()的真正实现在服务器上。一旦方法完成,骨干会编排从someMethod()方法返回的值。并将其发送给客户机。存根重新编排该返回值,并传递给客户机。如图:

幸运的是,RMI提供的抽象程序使得存根和骨干透明,从而允许Java开发人员能编写程序并如同调用本地方法一样的调用分布式方法。

但是,我们需要理解有关参数传递行为的规则:

  • 如果编排参数是本地(非远程)对象,那么通过称为对象序列化的技术来复制传递。不过,如果参数也是远程对象,那么可以通过引用传递。对于上面的例子,如果A是本地对象,而B是远程对象,那么A就序列化并复制传递,而B则通过引用传递。这是可以允许服务器远程执行B的方法。
  • 如果本地对象需要作为参数传递给远程对象,那么就必须实现Serializable接口。对象序列化允许将对象状态写入到字节流。

results matching ""

    No results matching ""