RMI 的相关概念

来源:互联网 发布:个人财务报表软件 编辑:程序博客网 时间:2024/05/17 04:35
1、java.rmi.server.RemoteObject类
   每一个远程类都有自身的特点,它必须刻画远程对象的行为,并提供基本语义以支持远程的调用,如:必须创建对象后输出到指定的端口以等待被远程调用。要使一个对象扩展远程行为可以有两种方法:
   a、把远程对象自身的引用(this)传送给不同形式的UnicastRemoteObject.exportObject()方法,以显式的形式输出自己。也就是说,在自己的程序中不需要扩展UnicastRemoteObject类,直接在自己的类中加入预计:UnicastRemoteObject.exportObject(this)即可。
   b、扩展java.rmi.server.RemoteServer类或者子类,以超类的方法输出自己。RemoteServer类有两个子类,一般都是扩展他的子类,他们分别是:UnicastRemoteObject和Activatable类,UnicastRemoteObject类定义了简单的传送远程对象,他要求其引用只有在服务器进程活动时才有效,这种方法是用的比较多的方法;Activatable类可以在其远程方法被调用时激活,并在必要的时候关闭自己,减少服务器上的占用资源。
    这里的“输出”一词封装了远程对象可接收请求的能力,多个对象可以在同一个端口上监听。
    对了,RemoteObject类是什么?他是RemoteServer的超类。
    注意:远程对象在必要是需要准确的实现冲Object类中继承的hashCode方法、equals方法和toString方法。
   2、Stub(存根)和Skeleton(骨架)
   Stub和Skeleton是经过rmic命令生成的,我们的程序要通过远程调用,底层一定是套接字的字节传输,要一个对象序列化成为一个字节数组,传输到服务器或者客户端的对端之后,再把该对象反序列化成为对应的对象,这些网络传输的过程要求安全,稳定等等非常麻烦的操作,Stub驻留客户端,承担着代理远程对象的实现者的角色,Skeleton类帮助远程对象与Stub再RMI连接上进行通信。RMI的客户与Stub进行交换,Stub与Skeleton通信,Skeketon负责与服务器进行交互,因此有了Stub和Skeleton之后我们就不需要实现底层通信的细节,我们进行的远程调用,只需要通过接口对方法进行操作即可,使分布式调用实现了位置上的透明,即:远程调用就像本地调用一样。
    通俗的说,RMI的代理模式迫使方法调用必须通过充当替身的代理对象,即Stub和Skeleton,由这些代理对象将方法传递给实际的对象。
    在远程虚拟机中,每个远程对象都有一个Skeleton对应,Skeleton负责将调用分配给实际的远程对象来实现,他的工作是在服务器端的。在JDK1.2版本以上的环境中不需要Skeleton,因为Jdk1.2推出了附加的Skeleton,并且对底层的协议也进行了修改,性能上有很大提升,默认的rmic命令是不会产生Skeleton类的,如果要想生成Skeleton类可以使用rmic -v1.1 即可。
    Stub的操作任务:
     a、初始化与包含远程对象远程虚拟机的连接
     b、与远程虚拟机参数进行编组,也就是调度,包括参数的写入以及传输
     c、等待方法的调用结果
     d、解编返回值和返回的异常。也就是读取服务器上的返回值,也称为反调度
     e、将结果返回给调用程序。
    Skeleton对应的任务:
     a、读取远程方法的参数,也就是解编
     b、调用实际远程对象上的方法
     c、将结果或者异常组编(写入并传输)给调用程序
    Stub与Skeleton的关系以及操作是对应的关系。只要我们有编译好的远程对象的类,就可以调用jdk的rmic命令来生成stub和skeleton了,关键是我们需要理解Stub是客户端应用程序的代理,Skeleton是服务器端应用程序的代理,他们之间协作完成客户端与服务器之间的方法调用时的通信。
    了解者两个概念之后,我们接下来需要了解JNDI以及RMI注册表两个概念,等剩下的两个概念了解了,我们基本上对RMI就可以入门了。
原创粉丝点击