关键词:
分布式计算系统要求运行在不同地址空间不同主机上的对象互相调用,在Java里提供了完整的sockets通讯接口,但sockets要求客户端和服务端必须进行应用级协议的编码交换数据,采用sockets是非常麻烦的。
一个代替Sockets的协议是RPC(Remote Procedure Call), 它抽象出了通讯接口用于过程调用,使得编程者调用一个远程过程和调用本地过程同样方便。RPC 系统采用XDR来编码远程调用的参数和返回值。
但RPC 并不支持对象,而EJB构造的是完全面向对象的分布式系统,所以,面向对象的远程调用RMI(Remote Method Invocation)成为必然选择。采用RMI,调用远程对象和调用本地对象同样方便。RMI采用JRMP(Java Remote Method Protocol)通讯协议,是构建在TCP/IP协议上的一种远程调用方法。
一、RMI机制解析
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。它的特点是只支持java语言编写的程序,并且允许方法返回 Java 对象以及基本数据类型,这和RPC不同,RCP是跨语言的通讯且不支持对象的概念。
RMI 采用stubs 和 skeletons 来进行远程对象(remote object)的通讯。
1、stub对象作为远程对象的客户端代理,运行在本地的虚拟机上,它有着和远程对象相同的的远程接口。
当运行在本地Java虚拟机上的程序调用运行在远程Java虚拟机上的对象方法时,它首先在本地创建该对象的代理对象stub, 然后调用代理对象上匹配的方法,代理对象会作如下工作:
A 与远程对象所在的虚拟机建立连接
B 打包(marshal)参数并发送到远程虚拟机
C 等待执行结果
D 解包(unmarshal)返回值或返回的错误
E 返回调用结果给调用程序
F stub 对象负责调用参数和返回值的流化(serialization)、打包解包,以及网络层的通讯过程。
2、skeleton对象运行在远程对象所在的虚拟机上,接受来自stub对象的调用。当skeleton接收到来自stub对象的调用请求后,skeleton会作如下工作:
A 解包stub传来的参数
B 调用远程对象匹配的方法
C 打包返回值或错误发送给stub对象
二、基本原理图
三、应用
在java的RMI中,其类图如下
各个类的源代码如下:
import java.rmi.Remote;
import java.rmi.RemoteException; public interface IService extends Remote { //声明服务器端必须提供的服务 String service(String content) throws RemoteException; } |
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; } } |
/*
* 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个远程服务对象!"); } } |
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(); } } } |
面试题思考:javarmi与rpc,jms的比较
RPC:(RemoteProcedureCall) 被设计为在应用程序间通信的平台中立的方式,它不理会操作系统之间以及语言之间的差异。支持多语言RMI:(RemoteMethodInvocation) RPC的Java版本,EJB的基础技术 RMI采用JRMP(JavaRemoteMethodProt... 查看详情
javarmi技术及其spring封装的使用
javaRMI即java远程服务调用,用于各个子系统之间的服务调用。最近应用到了JAVARMI技术,所以总结一下RMI的使用,另外EJB的实现也是以JavaRMI为基础核心的。RMI远程方法调用,可以跨机器通过网络调用,不过JavaRMI只支持两边都是Java... 查看详情
javarmi利用入门学习
Windows中遇到了JavaRMI,反弹又不那么方便,这时该如何利用呢?It’saquestion。正好加强Java学习了。0X00预备知识理解JavaRMI——Java远程调用提供了不同机器之间进行对象方法访问的能力,这样的构架允许一台机器的对象访... 查看详情
java安全初探-rmi篇
JavaRMI初识JavaRMI定义JavaRMI(JavaRemoteMethodInvocation),即Java远程方法调用。是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。JavaRMI使用JRMP(JavaRemoteMessageProtocol,Java远程消息交换协议)实现,使得客户端运行的... 查看详情
javarmi教程:入门与编译方法远程(代码片段)
1.概述转载:RMI教程:入门与编译方法2.分布式对象和RMI分布式对象技术主要是在分布式异构环境下简历应用系统框架和对象构件。在应用系统框架的支撑下,开发者可以将软件功能封装为更易于管理和使用的对象ÿ... 查看详情
javarmi地址解析问题(代码片段)
我正在尝试重新编写一些基本的设计模式。我只有代码片段,没有完整的运行代码示例。一种叫做代理模式。我只想通过远程调用方法。这是我的简单代码:WebService.JavapublicclassWebServiceextendsUnicastRemoteObjectimplementsIRemoteprivatestaticf... 查看详情
javarmi
RMI 相关知识RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是... 查看详情
javarmi如何返回远程对象的引用
服务器端1.进入jdk的bin目录:cd$JAVA_HOME/bin2.在该目录下新建文本jstatd.all.policy:vimjstatd.all.policy3.添加内容:grantcodebase"file:$java.home/../lib/tools.jar" permissionjava.security.AllPermission; ;4.在该目录启动jstatd服务:./jstatd-J-Djava.... 查看详情
java中rmi远程调用demo
Java远程方法调用,即JavaRMI(JavaRemoteMethodInvocation),一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全... 查看详情
springrmi解析1-使用示例
Java远程方法调用,即JavaRMI(Java RemoteMethodInvocation),是Java编程语言里一种用于实现远程过程调用的应用程序编程接口。它使客户机上的运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络... 查看详情
javarmi(代码片段)
protobuf通信协议(代码片段)
...么远程过程调用亦可称作远程调用或远程方法调用,例:JavaRMI。简单地说就是能使应用像调用本地方法一样的调用远程的过程或服务。很显然,这是一种client-server的交互形式,调用者(caller)是client,执行者(executor)是server... 查看详情
浅谈javarmi
浅谈JAVA-RMIserverdemo:packagecom.ray.rmi;importjava.rmi.Naming;importjava.rmi.Remote;importjava.rmi.RemoteException;importjava.rmi.registry. 查看详情
rmi使用笔记
Java远程方法调用,即JavaRMI(JavaRemoteMethodInvocation)。顾名思义,可以使客户机上运行的程序能够调用远程服务器上的对象(方法)。下面主要介绍一下使用步骤:1.定义远程接口(服务端)远程接口定义出可以让客户远程调用的... 查看详情
javarmi
1.RMI介绍 1.1RMI概念 1.2RMI构成2.API介绍 2.1关系图 2.2类介绍3.实例 参考文献: 1.https://blog.csdn.net/suifeng3051/article/details/48469523 2.https://blog.csdn.net/lmy86263/article/de 查看详情
javarmi的一个简单实例
参考网站 http://www.cnblogs.com/leslies2/archive/2011/05/20/2051844.html实体类PersonEntitypackagenet.cs30.rmi;importjava.io.Serializable;/***Createdbycaochenghuaon2017/4/4.*/publicclassPersonEntityimple 查看详情
java远程通讯技术及原理分析
在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什... 查看详情
rmi学习笔记
javaRMI(RemoteMethodInvocation)是一种基于java远程调用技术,是对RPC的java实现,可以在不同主机上进行通信与方法调用。PRC通信原理如图:方法调用从客户对象经占位程序(Stub)、远程引用层(RemoteReferenceLayer)和传输层(TransportLayer)... 查看详情