2019独角兽企业重金招聘Python工程师标准>>>

RMI(即Remote Method Invoke 远程方法调用)。在Java中,只要一个类extends了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。JavaDoc描述:Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。任何远程对象都必须直接或间接实现此接口。只有在“远程接口”(扩展 java.rmi.Remote 的接口)中指定的这些方法才可远程使用。

注意:extends了Remote接口的类或者其他接口中的方法若是声明抛出了RemoteException异常,则表明该方法可被客户端远程访问调用。

同时,远程对象必须实现java.rmi.server.UniCastRemoteObject类,这样才能保证客户端访问获得远程对象时,该远程对象将会把自身的一个拷贝以Socket的形式传输给客户端,此时客户端所获得的这个拷贝称为“存根”,而服务器端本身已存在的远程对象则称之为“骨架”。其实此时的存根是客户端的一个代理,用于与服务器端的通信,而骨架也可认为是服务器端的一个代理,用于接收客户端的请求之后调用远程方法来响应客户端的请求。

RMI 框架的基本原理大概如下图,应用了代理模式来封装了本地存根与真实的远程对象进行通信的细节。

下面给出一个简单的RMI 应用,其中类图如下:其中IService接口用于声明服务器端必须提供的服务(即service()方法),ServiceImpl类是具体的服务实现类,而Server类是最终负责注册服务器远程对象,以便在服务器端存在骨架代理对象来对客户端的请求提供处理和响应。

各个类的源代码如下:

IService接口:

import java.rmi.Remote; 
import java.rmi.RemoteException; 
public interface IService extends Remote { 
  //声明服务器端必须提供的服务 
  String service(String content) throws RemoteException; 
}

ServiceImpl实现类:

import java.rmi.RemoteException; 
//UnicastRemoteObject用于导出的远程对象和获得与该远程对象通信的存根。 
import java.rmi.server.UnicastRemoteObject;

public class ServiceImpl extends UnicastRemoteObject implements IService {

private String name;

public ServiceImpl(String name) throws RemoteException { 
    this.name = name; 
  } 
  @Override 
  public String service(String content) { 
    return "server >> " + content; 
  } 
}

Server类:

/* 
* Context接口表示一个命名上下文,它由一组名称到对象的绑定组成。 
* 它包含检查和更新这些绑定的一些方法。 
*/ 
import javax.naming.Context; 
/* 
* InitialContext类是执行命名操作的初始上下文。    
* 该初始上下文实现 Context 接口并提供解析名称的起始点。 
*/ 
import javax.naming.InitialContext; 
public class Server { 
  public static void main(String[] args) { 
    try { 
      //实例化实现了IService接口的远程服务ServiceImpl对象 
      IService service02 = new ServiceImpl("service02"); 
      //初始化命名空间 
      Context namingContext = new InitialContext(); 
      //将名称绑定到对象,即向命名空间注册已经实例化的远程服务对象 
      namingContext.rebind("rmi://localhost/service02", service02); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
    System.out.println("服务器向命名表注册了1个远程服务对象!"); 
  } 
}

Client类:

import javax.naming.Context; 
import javax.naming.InitialContext;

public class Client { 
  public static void main(String[] args) { 
    String url = "rmi://localhost/"; 
    try { 
      Context namingContext = new InitialContext(); 
      // 检索指定的对象。 即找到服务器端相对应的服务对象存根 
      IService service02 = (IService) namingContext.lookup(url 
          + "service02"); 
      Class stubClass = service02.getClass(); 
      System.out.println(service02 + " 是 " + stubClass.getName() 
          + " 的实例!"); 
      // 获得本底存根已实现的接口类型 
      Class[] interfaces = stubClass.getInterfaces(); 
      for (Class c : interfaces) { 
        System.out.println("存根类实现了 " + c.getName() + " 接口!"); 
      } 
      System.out.println(service02.service("你好!")); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
}

将以上代码保存于某一目录下,先运行“start rmiregistry”来启动JDK自带的注册表程序,它用于保存Server类注册的远程对象并允许远程客户端的请求访问;然后运行服务器端的Server类,即“start java Server”,该程序向注册表中注册具体的远程对象;最后才是运行客户端程序来查找并获得服务器端的远程对象存根,此时才能使用存根对象与服务器进行通信,命令是“java Client”。注意:上面命令中的start的功能是重新打开一个DOS窗口。

运行结果如下:

其实整个简单的RMI 应用中各个类的交互时序如下图:

转载于:https://my.oschina.net/chendongj/blog/898756

ava RMI 框架(远程方法调用)相关推荐

  1. Java RMI 框架(远程方法调用)

    RMI(即Remote Method Invoke 远程方法调用).在Java中,只要一个类extends了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定 ...

  2. 什么是rmi?为什么要使用rmi框架?

    大家好,我是IT修真院北京分院第31期的学员,一枚正直纯洁善良的JAVA程序员.今天给大家分享一下,修真院官网JAVA任务8的深度思考--什么是rmi?为什么要使用rmi框架? 1.背景介绍 什么是R ...

  3. 【Java】RPC与RMI框架

    [Java]RPC与RMI框架 概念 RMI概念 RPC概念 RMI框架 接口方法及接口实现对象的注册及其方法的调用 RPCFactory RPCDefinition 注解Scanning 服务器端 ...

  4. java动态加载类 框架_java运用RMI框架类的动态加载不成功

    最近在看<java网络编程精解>,第11章中用RMI动态加载类,可怎么试都不成功,求大神解答 1. 我先在C盘下启动了rmiregistry注册表,如果部署成功注册表应该会从codebas ...

  5. Java RMI服务远程方法调用漏洞

    JAVA RMI 反序列化远程命令执行漏洞 漏洞资料 背景 原理 Payload构造 搭建本地测试环境 开启包含第三方库的RMI服务 测试RMI客户端 攻击测试 升级版攻击 Weblogic Comm ...

  6. 什么是RMI,为什么要使用RMI框架?

    1.背景介绍 什么是RMI RMI是Java的一组拥护开发分布式应用程序的API.RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Met ...

  7. 分布式通信框架 - rmi

    知识点: 1)什么是rmi 2)简单的实现rmi 3)rmi原理 4)手写rmi框架 首先谈下什么RPC? Remote procedure call protocal 远程过程调用协议 不用知道具体 ...

  8. Java RMI远程方法调用详解

    Java RMI远程方法调用详解     [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51992182 一.Java R ...

  9. RMI(Remote Method Invocation,远程方法调用)

    RMI(Remote Method Invocation,远程方法调用) RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Jav ...

最新文章

  1. springcloud分布式事务_Springcloud 分布式事务集成Naco Seata
  2. Codeforces Global Round 4 题解
  3. SimpleDateFormat和DateFormat类不是线程安全的。
  4. 第三次学JAVA再学不好就吃翔(part77)--迭代器遍历
  5. 单片机shell命令_MCU调试大法:使用串口实现简单shell功能
  6. weblogic启动脚本
  7. 第二章 Jackson属性名转换+属性忽略
  8. 第51条:精简initialize与load的实现代码
  9. 自己动手制作USB启动盘
  10. 一维热传导方程求数值解
  11. 硬件负载均衡设备介绍
  12. 最基本的几种 CSS 文字滤镜效果 - 蓝色理想
  13. 秋风,唱给田野动听的歌
  14. 仿企查查、天眼查关系图以及架构图(双向树,集团图谱,组织架构图谱,企业图谱,网络拓扑,人物关系网络)
  15. 网页中HTML代码如何实现字体删除线效果
  16. android 点击状态栏,“点击状态栏回到顶部”功能的消失原因和实现
  17. 关于数据分析的一些实例报告
  18. linux去掉锁屏密码,使用ADB SHELL清除联想A390t的锁屏密码
  19. 昨晚我遇到了超级网红 区块链本人
  20. 第五十七周总结——坎坎坷坷的一周

热门文章

  1. ffmpeg 怎么处理udp音频_STREAM: srs 2.0release,ffmpeg实时转码udp流,出现只有音频没有视频的问题?...
  2. node python 速度_Java,Node,Python 运行速度比较
  3. python获取url参数 类继承_python之类的继承
  4. Redhat安装gtk2.0和pkg-config
  5. 移动端目标识别(1)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之TensorFlow Lite简介...
  6. 【Spark篇】---Spark初始
  7. 前端ajax封装对象数组,后台的取法
  8. jQuery 标签切换----之选项卡的实现
  9. cherrypy 入门笔记(1) hello world
  10. 发布方配模板引擎V2.1及开发教程和案例