这里简单说一下RMI和RPC的区别。

什么是RMI

RMI(Remote Method Invocation,远程方法调用),能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端Java虚拟机中的对象上的方法,是Java在JDK1.1中实现的,大大增强了Java开发分布式应用的能力,使用的代表是EJB。

RMI是Java的一组用户开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。简单来说,这样使得原来的程序在同一操作系统的方法调用变成了不同操作系统之间程序的方法调用。由于J2EE是分布式程序平台,它以RMI机制实现了程序组件在不同的操作系统之间的通信。比如一个EJB可以通过RMI调用Web上另一台机器上的EJB远程方法。

RMI远程方法调用的步骤

1.客户对象调用客户端辅助对象stub上的方法。

2.客户端辅助对象stub打包调用信息(变量、方法名),通过网络发送给服务端辅助对象skeleton。

3.服务端辅助对象skeleton将客户端辅助对象发送来的信息解包,找出真正被调用的方法以及该方法所在的对象。

4.调用真正服务对象上的真正方法,并将结果返回给服务端辅助对象skeleton。

5.服务端辅助对象将结果打包,发送给客户端辅助对象stub。

6.客户端辅助对象将返回值解包,返回给调用者。

7.客户对象获得返回值。

RMI的局限性

1.RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候却可能不知道将来的服务器IP和端口如何,而客户端程序调用是依赖这个IP和端口的。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。注意:我们在实际开发中,我们是知道服务器IP和端口的。

2.RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用WebService或者公用对象请求代理体系(CORBA)来实现。

什么是RPC

RPC(Remote Procedure Call Protocol,远程过程调用协议),是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议,使用的代表是Dubbo。RPC不依赖于具体的网络传输协议,TCP、UDP等都可以。

由于存在各式各样的变换和细节差异,相应的RPC也派生出了各式远程过程通信协议。RPC是跨语言的通信标准,SUN和微软都有其实现。比如RMI可以被看作SUN对RPC的Java版本(实现),而微软的DCOM就是建立在ORPC协议之上的。简单理解就是,RPC是一个协议,无论是SUN的RMI还是微软的DCOM都是对该协议的不同实现,二者都为编程人员提供了应用RC技术的程序接口(API)。

RPC远程过程调用的步骤

1.执行客户端调用语句,传送参数。

2.调用本地系统发送网络消息。

3.消息传送到远程主机。

4.服务器得到消息并获得参数。

5.根据调用请求以及参数执行远程过程(服务)。

6.执行过程完毕后,将结果返回服务器句柄。

7.服务器句柄返回结果,调用远程主机的系统网络服务发送结果。

8.消息传回本地主机。

9.客户端句柄从本地主机的网络服务接收消息。

10.客户端接收到调用语句返回的结果数据。

RMI与RPC的区别

1.方法调用的方式不同

RMI调用方法是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(Stub对象)上,那么这个新方法就不能被RMI客户方所调用。简单理解就是,远程方法需要先在远程接口上注册才能使用。

RPC调用函数是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成【classname.*methodname(参数集)】的形式。这就向RPC服务器表明了,被请求的方法是在classname类中,方法名是methodname。然后RPC服务器就会去搜索与之相匹配的类和方法,并把它作为方法参数类型的输入。这里的参数类型是与PRC请求中的类型相匹配的,一旦匹配成功,这个方法就被调用了,并会将执行结果编码后通过网络协议发回。

2.适用语言的范围不同

RMI只适用于Java并支持传输对象。

PRC是基于C语言的,并不支持传输对象,是网络服务的协议,与操作系统和语言无关。

3.调用结果的返回形式不同

因为Java是面向对象的,所以RMI也是面向对象的,RMI的调用结果可以是对象类型或者是基本数据类型。

PRC的返回结果统一由外部数据表示(External Data Representation,XDR)语言表示,这种语言抽象了字节序类和数据类型结构之间的差异,只有由XDR定义的数据类型才能被传递,可以说RMI是面向对象方式的Java RPC。

扩展阅读

Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实RMI可以被看作是RPC的Java版本(实现)。

传统RPC并不能很好地应用于分布式对象系统,而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

RMI目前使用Java远程消息交换协议(JRMP,Java Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的协议。因此,Java RMI具有Java的【Write Once,Run Anywhere】的优点,是分布式应用系统的百分之百纯Java解决方案。用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment Java,Java运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。

"我再也遇不到第二个你。"

rmi与rpc的区别的更多相关文章

  1. Java RMI与RPC的区别

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542811.html  一:RPC 远程过程调用 RPC(Remote Procedure Call Prot ...

  2. 面试题思考:Java RMI与RPC,JMS的比较

    RPC:(Remote Procedure Call)  被设计为在应用程序间通信的平台中立的方式,它不理会操作系统之间以及语言之间的差异. 支持多语言 RMI:(Remote Method Invo ...

  3. RPC、RMI、REST的区别

    初入职场,接触了不少企业常用的技术,与学校实训使用的技术有很大差异,在这里记录一下RPC.RMI与REST的区别. 概念 RPC(Remote Procedure Call,远程过程调用) 一种通过从 ...

  4. SOA,Webservice,SOAP,REST,RPC,RMI,JMS的区别与联系(转载)

    原文地址:http://blog.csdn.net/pcceo1/article/details/51245249 SOA面向服务的软件架构(Service Oriented Architecture ...

  5. 转 RMI、RPC、SOAP通信技术介绍及比对

    http://www.open-open.com/home/space.php?uid=37924&do=blog&id=8974 1.RMI 使用java的程序员,对于RMI(Rem ...

  6. RMI、RPC、SOAP通讯技术介绍及比对 - XML/SOAP

    RMI.RPC.SOAP通信技术介绍及比对 1.RMI 使用java的程序员,对于RMI(RemoteMethod Invoke,远程方法调用)一定不陌生,在java中,为了在分布式应用开发时,能够方 ...

  7. RMI、RPC、SOAP通信技术介绍及比对

    1.RMI 使用java的程序员,对于RMI(RemoteMethod Invoke,远程方法调用)一定不陌生,在java中,为了在分布式应用开发时,能够方便调用远程对象,java提供了RMI的API ...

  8. RMI,RPC,SOAP对比分析

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp60   1.RMI     使用java的程序员,对于RMI(Remot ...

  9. MQ & RPC 消息队列与RPC的区别与使用场景

    MQ:  区别:面向数据.生产者与消费者.有缓冲节点.异步.系统级/模块级通信 选型:RabbitMQ.ActiveMQ/Apollo.ZeroMQ.memcacheQ.Redis.MSMQ.kafk ...

随机推荐

  1. Linux之CentOS设置别名与屏蔽别名

    一.环境 CentOS6.8 二.设置别名 ◆别名功能:让grep符合的关键字高亮 1.临时生效 [root@localhost ~]#alias grep="grep --color=au ...

  2. 深入学习socket网络编程,以java语言为例

    了解java的socket编程与Linux Socket API之间的关系 一.java的网络编程 1.socket原理 socket通信就是通过IP和端口号将两台主机建立连接,提供通信.主机A的应用 ...

  3. 建议3:正确处理Javascript特殊值---(1)正确使用NaN和Infinity

    NaN时IEEE 754中定义的一个特殊的数量值.他不表示一个数字,尽管下面的表达式返回的是true typeof(NaN) === 'number' //true 该值可能会在试图将非数字形式的字符 ...

  4. CCF-CSP题解 201609-4 交通规划

    最小最短路径树. \(dis[j]==dis[i]+w(i,j)\)时,从\(w(i,j')\)和\(w(i,j)\)考虑.--从0分到100分. #include <bits/stdc++.h ...

  5. GTC 2019参会整理

    NVIDIA GTC 2019在苏州金湖国际会议中心举行,由于同事有其他会议冲突,所以我代替他来参加了此次会议.作为刚接触GPU和机器学习不久的新人来说,感觉进入了一个新世界,深刻体验到技术的革新迭代 ...

  6. 优先队列与TopK

    一.简介 前文介绍了<最大堆>的实现,本章节在最大堆的基础上实现一个简单的优先队列.优先队列的实现本身没什么难度,所以本文我们从优先队列的场景出发介绍topK问题. 后面会持续更新数据结构 ...

  7. Ajax 的基本使用

    Ajax简介 一门异步的加载技术,局部刷新 异步加载,可以在不重载整个网页的前提下,进行局部刷新 分为原生和JQ两种 JSON数据格式 Json对象转字符串: JSON.stringify() 字符串 ...

  8. Mysql中处理JSON字段

    处理json字段,可以用json_extract函数: select * from (select json_extract(ext_value,'$.high')+0 highx,batch_id ...

  9. webpack安装错误 ‘webpack : 无法加载文件’

  10. BOM的补充

    1.首先我们要知道BOM是干什么的? BOM和DOM.ES是JavaScript的重要三个组成部分: Bom的核心操作是window:简单来说就是用来操作浏览器的,他是js访问浏览器的接口,它里面封装 ...