RMI系统包括3层,端头/框架层(Stubs/Skeletons)、远程应用层(Remote Reference Layer)和传送层(Transport),如图所示:


  客户机调用远程方法时,请求用客户机的端头调用。客户机引用端头作为远程机上对象的代表。上图所示的所有基础功能在客户机上都看不到。端头代码由rmic编译器长生,并用远程引用层(RRL)将方法调用请求传递到服务器对象。

  1) 端头(Stub)
  端头就是代表远程对象的客户机方代理,定义远程对象版本支持的所有接口。端头在客户机上运行的程序像本地对象一样引用,从客户机来看与本地对象相似,它还保持与服务器方对象的连接。客户机方的远程应用层返回端头的调动流。客户方的RRL用调用流与服务器方的RRL通信。端头将参数数据串行化,将串行化的数据传递到调动流。
执行完远程方法调用后,RRL将串行化的返回值送回端头,负责反串行化。

  2) 框架(Skeleton)
  框架是与服务器方RRL接口的服务器方构件。框架接受客户机方RRL的方法调用请求。服务器方RRL要反调动发送到远程方法的任何变元。然后框架调用服务器方的实际对象实现。框架还负责接收来自远程对象的返回值并将其调动到调动流中。

  3) 远程引用层(Remote Reference Layer)
  远程引用层(RRL)负责维护不与具体端头或框架模型相关的独立应用协议。这个灵活性使RRL的改变不会影响另外两层。RRL涉及低级传送接口,负责向端头和框架层提供流。

  RRL通过传送层用客户机方面和服务器方构件通信。客户机方构件包含远程服务器的特定信息。这个信息传递到服务器方构件,因此只依赖于服务方RRL。服务器方RRL负责引用语法和处理这些语法之后再向框架发送远程方法调用。客户机和服务器方构件之间的通信由传送层处理。

  4) 传送层(Transport Layer)
  传送层负责建立并维护客户机和服务器之间的连接。传送层包括4个抽象:
  端点(endpoint)抽象用于引用包含Java虚拟机的地址空间,是具体传送接口的引用。
  通道(channel)抽象是两个地址空间之间的通路。这个通路负责管理客户机和服务器之间的各种连接。
  连接(connection)抽象是客户机和服务器之间数据(变元和返回值)传送的抽象。
  传送(transport)抽象负责建立本地地址空间和远程端点之间的通道。传送抽象还负责接收到包含抽象的地址空间的输入连接。
  传送层建立连接,管理现有连接和处理地址空间中的远程对象。
  传送层接收客户机方RRL请求时,它寻找请求的远程对象的RMI服务器,然后传送层建立到这个服务器的接插连接。接着,传送层将建立的连接传递到客户机RRL上并将远程对象的引用加入内部表。这时客户机即连接到服务器。
  传送层监视连接的"活性"。如果经过较长时间连接毫无动静,则传送层负责关掉这个连接。
  
  RMI的分层结构不仅在概念上显得很清晰和合理,而且也给我们开发RMI应用程序提供了极大的方便,设想一下,如果我们需要去了解传送层的细节,那么,RMI的应用程序的开发将会是一件很艰巨的任务。幸好,我们没有必要那么做,RMI的分层结构是我们可以在高层进行开发而不必要去理会底层的细节,其实,开发RMI应用程序和开发普通的Java应用程序几乎没有什么区别。