rmi开发基本步骤

来源:互联网 发布:网络推广员专业知识 编辑:程序博客网 时间:2024/06/05 17:22

RMI基本体系结构简介
  RMI通过TCP/IP在内部使用Socket,象其名称暗示的那样,它能够帮助我们查找并执行远程对象的方法。RMI的目的是让位于不同JVM中的对象,在外观及行为上都像是本地的对象。
  
  通常,我们把调用这种远程对象的JVM,称为客户机;而把包括这种远程对象的JVM,称为服务器。
  
  尽管对一个远程对象的引用和获得对本地对象的引用有所不同,但我们可以把远程对象像本地对象一样使用。应用程序并不知道一个对象是远程的还是本地的。实际上,远程对象上被调用的方法与本地对象上调用的方法,具有相同的语法结构。
  
  作为RMI的底层(会包含复杂的Socket操作),它会自动截获方法调用,找到远程对象,然后处理远程请求。笔者认为,RMI设计的重要之处,就在于不但在设计上实现了远程访问功能,而且实现了设计的透明性。
  
  RMI的基本体系结构,概括起来说,由三个抽象层组成:
  
  1、存根/框架层(Stubs/Skeletons Layer)
  
  RMI为我们引入了两种特殊类型的对象,称为存根(Stub)和框架(Skeleton),它们组成了RMI的第一层。
  
  在远程通信的时候,要利用TCP/IP协议,做很多底层数据的打包传输。运用Java技术,我们先要把数据或者对象转换成字节流(byte stream),便于网络传输,这个过程叫汇集(marshaling);当收到远程传来的字节流后,我们要把流信息转换成对象或者数据,这个过程叫解读(unmarshaling),它与汇集刚好相反。
  
  Stub和Skeleton层位于实际应用程序之下,建立在Proxy(代理)设计方案之上。Stub类的作用是远程服务器实现的代理的角色,Stub是客户方对象;Skeleton类用于帮助对象通过RMI链接与Stub通信,它从链路中读取方法调用的参数,向远程服务实现对象进行调用,接受返回值,然后再把返回值写回到Stub。
  
  2、远程引用层(Remote Reference Layer)
  
  远程引用层定义和支持着RMI连接的调用语义(semantics)。
  
  RMI进行远程访问要用到JRMP(Java Remote Method Protocol,即Java远程方法协议),这一层提供专用于JRMP的RemoteRef对象,它位于java.rmi.server包内,代表着远程对象的一个句柄。RemoteRef使用远程引用来执行远程对象的一个远程方法调用。
  
  3、传输层(Transport Layer)
  
  传输层在JVM之间建立基于流的网络连接,并且负责设置和管理这些连接。这时候,RMI使用一种线级(wire-level)协议进行基于TCP/IP的连接,该协议就是Java远程方法协议(JRMP,即Java Remote Method Protocol)。
  
  在JDK版本1.2开始,JRMP不再需要Skeleton,而是使用reflection来建立与远程服务的连接。为了生成Stub,我们须用rmic。
  当前的RMI实现中,传输层建立在TCP/IP基础上,设计用于在客户和服务器之间建立一条连接(即使联网有障碍)。



发的基本步骤

  我们使用RMI编写Client/Server模式(客户/服务器)应用程序,包括6个基本步骤:
  
  1) 定义远程接口
  
  2) 实现远程接口
  
  3) 准备远程调用的服务器对象
  
  4) 生成残根Stub(客户代理)和框架Skeleton(服务器实体)
  
  5) 用rmiregistry找到远程对象
  
  6) 运行测试RMI分布式应用
  
  开发企业信息发布系统实例
    现在,我们就以开发公司信息发布系统为例,把主模块(主要的类文件)的名称暂定为InfoDistributeService(信息发布服务),为了保持应用开发的数据一致性和清晰度,接下来涉及的其它模块命名也将以这个模块命名为基准。
  
  1、定义远程接口
  
  Java RMI运行环境要求任何可以远程调用的方法必须放在远程接口中。
  
  该远程接口用来扩展java.rmi.Remote接口,在Java API中,可以发现它没有任何方法,只是个标志性接口,这样,可以让Java运行环境(JRE)认识每个接口的特殊属性,以便能够远程访问。
  
  因此,按照信息发布服务的命名(InfoDistributeService),首先须将InfoDistributeRemote定义为远程接口,同时仅放入一个供测试的方法 getRemoteInfo()来实现编码,将所有模块至于新建的enterprise.distribute包中,代码如下:
  
  // -----------InfoDistributeRemote.java-------------------
  package enterprise. distribute;
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  public interface InfoDistributeRemote extends Remote{
  public String getRemoteInfo() throws RemoteException;
  }
  
  2、实现远程接口
  
  这是一个实现远程对象的类。如果实现了远程接口,就能够覆盖(override)该对象中的所有方法,因此,远程对象的实现类将真正包含我们希望导出的方法的代码。
  
  在远程信息发布系统中,我们至少实现一个远程接口的对象,它就是远程可访问的对象。这里,InfoDistributeService类可以为我们生成远程可访问对象的实例:
  
  // -----------InfoDistributeService.java------------------
  package enterprise. distribute;
  import java.rmi.RemoteException;
  import java.rmi.server.UnicastRemoteObject;
  public class InfoDistributeService
  extends UnicastRemoteObject implements InfoDistributeRemote{
  public InfoDistributeService() throws RemoteException{
  super();
  }
  // The return value of the method only for testing...
  public String getRemoteInfo(){
  return "Hello! I am a remote object.";
  }
  }
  
  InfoDistributeService类实现远程接口InfoDistributeRemote,并继承java.rmi.server.UnicastRemoteObject。
0 0