专栏首页吴伟祥RMI(远程方法调用)介绍 转

RMI(远程方法调用)介绍 转

本文简单介绍下RMI。即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

1.RMI介绍

RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。 RMI是针对JAVA有效的RPC,常用于一个jvm中调用另外一个jvm中的Service方法获得数据。

2.RMI原理:

RMI流程原理如下图:

1.rmi服务注册他的名字和IPRMI注册中心(bind) 2.rmi客户端通过IP和名字去RMI注册中心找相应的服务(lookup) 3.rmi Stub序列化调用的方法和参数编组后传给rmi Skeleton(call) 4.rmi skeleton执行stub的逆过程,调用真实的server类执行该方法(invocation) 5.rmi skeleton将调用函数的结果返回给stub(return)

Java RMI(远程方法调用) 实例与分析

java远程调用rmi入门实例

切记:相关的类的包的路径要跟服务器一样

有了远程对象实现类,看服务端的启动逻辑,其中:

Registry rr = LocateRegistry.createRegistry(1234);

LocateRegistry类:用于创建或获取某端口的对象注册表

LocateRegistry.createRegistry:这个方法表示获得远程对象注册表引用,返回Registry对象

Registry:真正操作远程对象注册表的接口

接着,

rr.bind("testrmi", r);

利用Registry的对象,把刚刚创建的远程对象注册为名称testrmi. 这里还有一种写法,效果是一样的.

LocateRegistry.createRegistry(1234); //创建,如果已经创建了就可省略这一句
Naming.bind("rmi://localhost:1234/testrmi", r);//需要带上端口

Naming:与对象注册表交互的工具类

上面是服务端从远程对象创建到对象注册的整个逻辑.客户端调用的逻辑比较简单,先通过Naming工具类获取到远程对象的引用以后,就可以正常使用了

(IRemote) Naming.lookup("rmi://localhost:1234/testrmi");

这里返回的"引用"和通常讲的对象引用不同,是远程对象的引用信息.拿到这个"引用"以后就可以像使用真正的对象一样调用其中的方法.

客户端再访问就会出现异常了,rmi所有远程方法都不能用了! 异常信息:java.rmi.NoSuchObjectException: no such object in table 答: 服务器端的服务对象被垃圾回收了。建议把服务对象变成静态成员。  public static ServerObject serverObject =new ServerObject ();  ......  Naming.rebind(serverName, serverObject); 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 远程方法调用(RMI)原理与示例 转

      远程方法调用(RMI)顾名思义是一台机器上的程序调用另一台机器上的方法。这样可以大致知道RMI是用来干什么的,但是这种理解还不太确切。RMI是Java支撑分...

    wuweixiang
  • 过早优化是万恶之源 转

    Don’t Cut Yourself: Code Optimization as a Double-Edged Sword。中文翻译:过早优化是万恶之源。

    wuweixiang
  • firewall指定某个IP访问某个端口+mysql 添加某个ip 允许访问

    firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="127...

    wuweixiang
  • 不平衡有源配电系统中的两层电压/无功控制:有效的优化和精确的跟踪

    原文题目:Two-Layer Volt/VAR Control in Unbalanced Active Distribution Systems: Effic...

    非过度曝光
  • MySQL单表查询

    3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组

    changxin7
  • 有坑勿踩(一):MongoDB PSS vs PSA

    在技术社区混了这么长时间,因为一些常见的技术问题反复被问到,总是想写写文章把它们讲清楚。无奈很多时候看似基础的技术问题背后都隐藏着很深的原因,想要一次性说清楚太...

    MongoDB中文社区
  • EasyFlash V4.0 ENV 功能设计与实现

    EasyFlash 是我个人开发的第二款开源软件,自 2015 年初正式开源出来,至今(2019.02)已经经历了 4 年多时间。期间有很多其他行业的嵌入式开...

    Mculover666
  • 加速域传播:一种高效的稀疏矩阵GPU并行算法 (CS)

    线性约束的快速域传播算法已成为当今混合整数规划和伪布尔优化的最佳算法和求解器的重要组成部分,以获得最佳的求解性能。输入数据中动态算法行为、依赖结构和稀疏模式等形...

  • 迅雷CEO陈磊 | 迅雷的区块链生态梦。

    5月16日,迅雷(NASDAQ:XNET)召开区块链生态及新品发布会。会上,迅雷CEO陈磊提出了在迅雷的区块链网络上建立起生态的计划。迅雷集团高级副总裁董鳕向《...

    区块链领域
  • Quartz.NET 1.0正式发布

    Quartz.NET 项目在Marko Lahma的领导下,经历了2年多时间的开发,bug修复和新特性开发终于发布了1.0版本,这个版本对Quartz.NET来...

    张善友

扫码关注云+社区

领取腾讯云代金券