[面试]RMI笔记


 JAVA RMI是JAVA分布式结构的基础。 远程对象的通信过程中, RMI 使用标准机制: stub 和skeleton 。远程对象的 stub 担当远程对象的客户本地代表或代理人角色,调用程序将调 用本地stub 的方法,而本地 stub 将负责执行对远程对象的方法调用。在 RMI 中,远程对象的 stub 与该远程对象所实现的远程接口集相同。调用 stub 的方法时将执行下列操作: 
   (1) 初始化与包含远程对象的远程虚拟机的连接; 
  (2) 对远程虚拟机的参数进行编组-传输参数; 
  (3) 等待远程方法调用结果; 
  (4) 解编(读取)返回值或返回的异常; 
  (5) 将值返回给调用程序。

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

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

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

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

  stub 和 skeleton 由 rmic 编译器生成。在最新的JDK中,不需要手工生产stub和skeleton,用动态代理生成的Proxy代替了stub,而skeleton则取消了。

  我们可以查看源代码来了解RMI的内部实现。Server端调用UnicastRemoteObject的export方法输出远程对象,export方法会在一个线程里监听某个TCP端口上的方法调用请求。


RMI的编程模型是采用框架和桩的模式,基本原理如下:
客户请求------>(rmi协议)---------->远程框架(注册机)------------>远程对象----------(处理)--------->结果返回到框架--------->客户

1. 服务器端创建远程接口和实现远程接口的类
2. 通过RMIC命令(%java_home%/bin/rmic.exe)来编译远程接口实现类从而生成 stub等文件.
3. 运行 rmiregistry命令(%java_home%/bin/rmiregistry.exe) 来启动RMI远程注册机
4. 向RMI注册机注册远程对象供客户端调用

socket的效率要高于rmi, socket是通过套接流的直接读写方式,只经过传输层。 
rmi经过传输层 〉〉应用层有专门rmi服务做解析 生成远程对象。



你可能感兴趣的:([面试]RMI笔记)