RMI远程方法调用讲解教程
JAVA_RMI使用快速入门
JAVA_RMI使用快速入门Java RMI(Remote Method Invocation,远程方法调用)是一种用于实现分布式系统的Java API,它允许在不同的Java虚拟机上通过网络调用远程对象的方法。
在这篇文章中,我们将快速入门Java RMI,并了解如何使用它来创建一个简单的分布式系统。
1.理解RMI的概念RMI的基本思想是将远程调用看作是本地调用的一种特殊形式,在RMI中,客户端和服务器可以通过网络传输Java对象的引用。
客户端可以通过远程对象的引用来调用它的方法,就像调用本地对象一样。
2.创建远程接口首先,我们需要定义一个远程接口,它列出了远程对象上可用的方法。
这个接口必须扩展java.rmi.Remote接口,并且每个方法都必须声明抛出java.rmi.RemoteException异常。
下面是一个简单的例子:```javaimport java.rmi.Remote;import java.rmi.RemoteException;public interface Hello extends RemoteString sayHello( throws RemoteException;```3.实现远程接口接下来,我们需要实现远程接口,并发布它作为一个RMI对象。
通过扩展java.rmi.server.UnicastRemoteObject类并实现远程接口,我们可以创建一个远程对象。
下面是实现上面接口的一个例子:```javaimport java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class HelloImpl extends UnicastRemoteObject implements Hellopublic HelloImpl( throws RemoteExceptionsuper(;}public String sayHello( throws RemoteExceptionreturn "Hello, world!";}```4.注册远程对象在将远程对象发布到网络之前,我们需要创建一个注册表来管理远程对象的绑定。
RMI远程方法调用
RMI实例
编写远程接口
import java.rmi.Remote; import java.rmi.RemoteException; public interface IExample extends Remote { public int count(int i)throws RemoteException; }
生成辅助类
使用rmic生成存根和骨架
编写客户端
public class Client{ public static void main(String[] args) { IExample i=null; try { String target="rmi://localhost:1000/Example"; Remote remoteObject=Naming.lookup(target); i=(IExample)remoteObject; System.out.println(i.count(5));//简单的方法调用 }catch(Exception e) { System.err.println("error in lookup()"+e.toString()); } } }
实现远程实现
public class Example extends UnicastRemoteObject implements IExample { public static void main(String[] args) { Registry reg=null; try{ reg=LocateRegistry.createRegistry(1000); Example e=new Example(reg); }catch(Exception ee){} } public Example(Registry reg)throws Exception,RemoteException{ super(); reg.rebind("Example",this); } public int count(int i) throws RemoteException{ return i-1; } }
RMI,远程方法调用(Remote Method Invocation)
RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。
RMI是非常容易使用的,但是它非常的强大。
RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。
下面我们通过具体的例子,建立一个简单的远程计算服务和使用它的客户程序一个正常工作的RMI系统由下面几个部分组成:●远程服务的接口定义●远程服务接口的具体实现●桩(Stub)和框架(Skeleton)文件●一个运行远程服务的服务器●一个RMI命名服务,它允许客户端去发现这个远程服务●类文件的提供者(一个HTTP或者FTP服务器)●一个需要这个远程服务的客户端程序下面我们一步一步建立一个简单的RMI系统。
首先在你的机器里建立一个新的文件夹,以便放置我们创建的文件,为了简单起见,我们只使用一个文件夹存放客户端和服务端代码,并且在同一个目录下运行服务端和客户端。
如果所有的RMI文件都已经设计好了,那么你需要下面的几个步骤去生成你的系统:1、编写并且编译接口的Java代码2、编写并且编译接口实现的Java代码3、从接口实现类中生成桩(Stub)和框架(Skeleton)类文件4、编写远程服务的主运行程序5、编写RMI的客户端程序6、安装并且运行RMI系统1、接口第一步就是建立和编译服务接口的Java代码。
这个接口定义了所有的提供远程服务的功能,下面是源程序://Calculator.java//define the interfaceimport java.rmi.Remote;public interface Calculator extends Remote{public long add(long a, long b)throws java.rmi.RemoteException;public long sub(long a, long b)throws java.rmi.RemoteException;public long mul(long a, long b)throws java.rmi.RemoteException;public long div(long a, long b)throws java.rmi.RemoteException;}注意,这个接口继承自Remote,每一个定义的方法都必须抛出一个RemoteException异常对象。
远程方法调用
RMI远程调用过程
Remote reference module
远程引用模块:翻译本地和远程对象引用以 及创建远程对象引用。 每个进程中的远程引用模块都有一个远程对 象表,记录着该进程的本地对象引用和远程 对象引用的对应关系。这张表包括: ~该进程拥有的所有远程对象的表项 (B) ~每个本 module
远程引用模块的动作: ~当远程对象第一次作为参数或结果传递时,要 求远程引用模块创建一个远程对象引用并把它添 加到表中。 ~当远程对象引用随着请求/应答消息到达时,远 程引用模块提供对应的本地对象引用,它可能指 向一个代理,也可能指向一个远程对象。若远程 对象引用不在表中,那么RMI软件就创建新的代 理并要求远程对象引用模块把它添加到表中。
RMI原理
RMI中应用代理
RMI
代理:作用是通过在调用者面前表现得像本地对象一样,使 远程方法调用对客户透明,它不执行调用,而是将调 用放在消息里传递给远程对象。 调度程序:接收并传递来自通信模块的请求消息,使用方法 ID选择骨架中恰当的方法。 骨架:用于实现远程接口中的方法。骨架解码请求消息中的 参数,并调用远程对象中的相应方法,等待调用的完 成,然后将结果和任何异常信息编码进应答消息,发 送给代理。
远程方法调用
Remote and local method invocations
远程方法调用:不管是否在同一台计算机 内,不同进程中的对象之间 的方法调用。 本地方法调用:在同一进程中的对象之间 的方法调用。
远程调用示例
远程对象:能够接收远程调用的对象
eg:B,F
远程接口:每个远程对象都有一个远程接口
远程方法调用
Software Engineering Network Programming
10.2 创建远程方法调用
编写远程接口 以下例程是HelloService接口的源程序。在这个接口中声明 了echo()和getTime()两个方法,它们都声明抛出 RemoteException。 例程HelloService.java package hello; import java.util.Date; import java.rmi.*; public interface HelloService extends Remote{ public String echo(String msg) throws RemoteException; public Date getTime() throws RemoteException; }
Software Engineering Network Programming
10.1 RMI 概述
1、什么是RMI: RMI是一种计算机之间对象互相 调用对方函数,启动对方进程的一种机制,使用这 种机制,某一台计算机上的对象在调用另一台计算 机上的方法时,使用的程序语法规则和在本机上对 象间的方法调用的语法规则一样
Software Engineering Network Programming
10.1 RMI 概述
3、RMI组成 1.一个需要这个远程服务的客户端程序 2.远程服务的接口定义 3.远程服务接口的具体实现 4.桩(Stub)和框架(Skeleton)文件 5.一个运行远程服务的服务器 6.一个RMI命名服务,它允许客户端去发现这个远程服务 7.类文件的提供者(一个HTTP或者FTP服务器)
Software Engineering Network Programming
Spring RMI远程方法调用配置
Spring--RMI远程方法调用服务器端配置(1)首先新建一个j2se项目,添加相关jarcommons-logging-1.1.1.jar-----打印日志spring-2.5.6.SEC02.jar-----解决异常:ng.NoClassDefFoundError: org/aopalliance/aop/Advicespring-aop-2.5.6.jarspring-beans-2.5.6.SEC02.jarspring-context-2.5.6.SEC02.jarspring-context-support-2.5.6.SEC02.jarspring-core-2.5.6.SEC02.jar(2)新建一个接口如下:public interface ILogPerson{public String getPersion();public void setPersion(String info);}(3)接口实现类:public class LogPerson implements ILogPerson{private String delegateinfo;@Overridepublic String getPersion(){return delegateinfo;}public void setPersion(String info){this.delegateinfo=info;}}(4)添加Spring配置文件appcontextrmiserver.xml(名字自定义)<bean id="logPersonService"class="org.springframework.remoting.rmi.RmiServiceExporter"> <property name="serviceName"><value>LogPerson</value></property><property name="serviceInterface"><value>com.test.rmi.ILogPerson</value></property><property name="registryPort"><value>1200</value></property></bean>(5)注册服务(其实就是获取bean)可以新建一个测试类,在main方法中获取bean信息public static void main(String[]args){//BeanFactory factory=new XmlBeanFactory(new FileSystemResource("appcontextrmiserver.xml"));//ApplicationContext context=new ClassPathXmlApplicationContext("appcontextrmiserver.xml");Resource resource=new ClassPathResource("appcontextrmiserver.xml");BeanFactory factory=new XmlBeanFactory(resource);factory.getBean("logPersonService");}(6)执行main方法,如果看到一下信息就表示注册成功!服务器端注册成功::信息:Binding service'LogPerson'to RMI registry: RegistryImpl[UnicastServerRef[liveRef:[endpoint:[10.13.122.200:1200](local),objID:[0:0:0,0]]]]10.13.122.200就是当前服务器的ip地址,1200是在xml中配置的注册端口号客户端调用配置(1)新建一个j2se项目(2)将服务器端的接口和接口实现类打成jar文件(或者直接将服务器端接口和接口实现类直接拷到应用中),添加到应用中,然后添加相关Spring的jar(3)添加Spring配置<bean id="LogPerson"class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <property name="serviceUrl"><value>rmi://10.13.122.193:1200/LogPerson</value>//对应服务器端IP地址和配置的端口号,LogPerson指服务器端配置的serviceName的value值</property><property name="serviceInterface"><value>com.test.rmi.ILogPerson</value>//对应服务器端配置的"serviceInterface"的value值</property></bean>(4)添加测试类public class LogPersonRmiClient{public static void main(String[]args){ApplicationContext context=newClassPathXmlApplicationContext("appcontextrmiserver.xml");ILogPerson clientLog=(ILogPerson)context.getBean("LogPerson");clientLog.setPersion("RMI客户端调用!");}}经常出现的异常:(1)写一个rmi客户端程序,你可能会收到如标题这样的异常。
Java程序设计课件第十二章 远程方法调用(RMI)
9
对象序列化 既然是分布式应用系统,就涉及多JRE的问题。在A JRE 中的对象,它的内存地址是0xabcdef,该地址存放的值,和 B JRE中的该地址放的值是不同的,所以,RMI不支持序 列化是不行的。所谓对象序列化是指对象可以象数据 一样进行保存和传输,要使对象可以序列化,其类必 须实现Serializable接口。我们在RMI的包中可以看到 支持Serializable(可序列化)的接口.
25
安全:RMI使用Java内置的安全机制保证下载执行程 序时用户系统的安全。RMI使用专门为保护系统免遭 恶意小应用程序侵害而设计的安全管理程序,可保护 您的系统和网络免遭潜在的恶意下载程序的破坏。在 情况严重时,服务器可拒绝下载任何执行程序。
26
便于编写和使用:RMI使得Java远程服务程序和访问 这些服务程序的Java客户程序的编写工作变得轻松、 简单。远程接口实际上就是Java接口。服务程序大约 用三行指令宣布本身是服务程序,其它方面则与任何 其它Java对象类似。这种简单方法便于快速编写完整 的分布式对象系统的服务程序,并快速地制做软件的 原型和早期版本,以便于进行测试和评估。因为RMI 程序编写简单,所以维护也简单。
RMI是Java的一组拥护开发分布式应用程序的API。 RMI使用Java语言接口定义了远程对象,它集合了Java 序列化和Java远程方法协议(Java Remote Method Protocol)。简单地说,这样使原先的程序在同一操作 系统的方法调用,变成了不同操作系统之间程序的方 法调用,由于J2EE是分布式程序平台,它的RMI机制 实现了程序组件在不同操作系统之间的通信。比如, 一个EJB可以通过RMI调用Web上另一台机器上的EJB 远程方法。
31
《远程方法调用》课件
物联网:远程方 法调用在物联网 中的应用可以加 速设备间的通信 和协作,提高物 联网应用的智能
化和实时性。
人工智能:远程 方法调用在人工 智能中的应用可 以加速算法学习 和模型训练,提 高人工智能应用 的准确性和智能
化。
对行业的影响和推动作用
提高软件开发效率: 远程方法调用可以减 少代码重复,提高软 件开发效率。
处理能力
优化数据库 性能:优化 数据库结构, 优化数据库 查询语句, 提高数据库
处理能力
优化缓存策 略:使用高 效的缓存策 略,减少数 据重复查询 和传输,提 高系统性能
安全保障措施和方案
加密传输:使用 SSL/TLS等加密协 议进行数据传输, 确保数据在传输过 程中的安全性。
身份验证:通过用户 名、密码、验证码等 方式进行身份验证, 确保只有授权用户才 能访问系统。
可靠性问题:远程 方法调用可能会导 致可靠性问题,因 为网络连接可能会 中断
复杂性问题:远程 方法调用可能会导 致复杂性问题,因 为需要处理分布式 系统的问题
04
远程方法调用的应用场景
分布式系统
提高系统可用性:通过分布式部署,提高系统的可用性和可靠性 提高系统性能:通过分布式部署,提高系统的性能和响应速度 提高系统可扩展性:通过分布式部署,提高系统的可扩展性和灵活性 提高系统安全性:通过分布式部署,提高系统的安全性和容错性
种格式
应用:Thrift广泛应用于分布式 系统、微服务架构等领域
A
B
C
D
E
特点:支持多种编程语言,包括 Java、C++、Python等
技术:Thrift使用IDL(接口定 义语言)来定义服务接口,支持
同步和异步调用
8远程方法调用
8.2 创建第一个RMI应用
• 大致说来,创建一个RMI应用包括以下步骤:
(1)创建远程接口:继承java.rmi.Remote接口。 (2)创建远程类:实现远程接口。 (3)创建服务器程序:负责在rmiregistry注册表中 注册远程对象。 (4)创建客户程序:负责定位远程对象,并且调用 远程对象的方法。
2
分布式对象模型
• 分布式对象模型的实现系统应该具备以下功能:
(1)把分布在不同节点上的对象之间发送的消息转换为字节序列,这 一过程称为编组(marshalling)。 (2)通过套接字建立连接并且发送编组后的消息,即字节序列。 (3)处理网络连接或传输消息时出现的各种故障。 (4)为分布在不同节点上的对象提供分布式垃圾收集机制。 (5)为远程方法调用提供安全检查机制。 (6)服务器端运用多线程或非阻塞通信机制,确保远程对象具有很好 的并发性能,能同时被多个客户访问。 (7)创建与特定问题领域相关的各种本地对象和远程对象。
• lookup(String name):查找对象,返回与参数name指定的名字所 绑定的对象。
• unbind(String name):注销对象,取消对象与名字的绑定。
21
8.2.3 创建服务器程序
• 以下程序代码注册了一个HelloServiceImpl对 象,并且给它命名为“rmi:HelloService1”:
4
Java虚拟机
对象 main(String args[])
方法请求
方法响应
Java虚拟机
远程对象 method1(…) method2(…)
运行在一个JVM上的对象调用另一个JVM上的对象方法
5
服务器程序 骨架 远程引用层 传输层
RMI 的运行逻
RMI 的运行逻
RMI(远程方法调用)是一种在分布式系统中进行远程通信的技术,其运行逻辑如下:
客户端调用远程对象方法:客户端通过本地接口调用远程对象的方法,就像调用本地对象一样。
1.Stub 封装调用参数:本地接口的实现对象,也就是Stub,会将客户端调用方法的参数进行封装,以便进行传输。
2.远程传输:Stub 将封装好的参数通过网络传输给远程对象,即服务器端的Skeleton。
3.Skeleton 解封装参数:Skeleton 接收到远程传输的参数后,将其解封装,并调用实际的远程对象方法进行处理。
4.远程方法调用:远程对象执行客户端请求的方法,返回结果。
5.Skeleton 返回结果:Skeleton 将远程对象执行方法的结果封装,通过网络传输回客户端。
6.Stub 接收结果:Stub 接收到远程传输的结果后,将其解封装,返回给客户端。
RMI 的运行逻辑可以简单地概括为客户端通过本地接口调用远程对象方法,而Stub 和Skeleton 则负责将调用参数和结果进行封装和解封装,并进行网络传输。
这种运行逻辑使得远程方法调用看起来像是本地方法调用一样简单,同时也可以在分布式系统中实现不同节点之间的通信,方便地进行远程操作和数据传输。
java内调用远程接口的方法
java内调用远程接口的方法Java内调用远程接口的方法主要有两种方式:使用Java RMI(远程方法调用)和使用Web服务。
1. 使用Java RMI:- 在远程接口所在的项目中定义接口和实现类,并继承java.rmi.Remote接口。
- 将接口和实现类编译打包成JAR文件,并将JAR文件发布到远程服务器上。
- 在调用方项目中,使用java.rmi.Naming类的lookup()方法获取远程接口的实例。
- 通过远程接口实例调用接口中定义的方法。
示例代码:```java// 远程接口定义public interface RemoteService extends java.rmi.Remote {public String sayHello() throws java.rmi.RemoteException;}// 远程接口实现类public class RemoteServiceImpl extends java.rmi.server.UnicastRemoteObject implementsRemoteService {public RemoteServiceImpl() throws java.rmi.RemoteException {super();}public String sayHello() throws java.rmi.RemoteException {return "Hello, World!";}}// 调用方代码public class Client {public static void main(String[] args) {try {// 获取远程接口实例RemoteService remoteService = (RemoteService) java.rmi.Naming.lookup("rmi://localhost/RemoteService");// 调用远程接口方法String result = remoteService.sayHello();System.out.println(result);} catch (Exception e) {e.printStackTrace();}}}```2. 使用Web服务:- 在远程接口所在的项目中定义接口和实现类,并使用@WebService注解标记接口和实现类。
java rmi原理
java rmi原理
Java RMI(远程方法调用)是一种允许在不同Java虚拟机之
间进行远程通信的机制。
它允许在网络上的一个Java应用程
序中调用另一个Java应用程序的方法,就像调用本地方法一样。
Java RMI的原理如下:
1. 客户端调用远程对象方法:客户端通过获取远程对象的引用(存根)来调用远程对象的方法。
这个引用使得客户端能够像调用本地对象一样调用远程对象的方法。
2. 远程对象存根:客户端每次调用远程对象的方法时,实际上是通过存根来完成的。
存根是客户端的代理对象,它位于客户端的Java虚拟机中,用于转发远程方法调用。
3. 远程对象代理:存根将方法调用转发给远程对象的代理。
远程对象代理将方法调用打包成远程方法调用请求,然后通过网络发送给服务器端。
4. 服务器端接收请求:服务器端接收到远程方法调用请求后,将请求传递给远程对象。
5. 远程对象调用方法:远程对象收到请求后,执行相应的方法,并将结果返回给远程对象代理。
6. 远程对象代理返回结果:远程对象代理接收到结果后,将结
果返回给存根。
7. 存根返回结果:存根收到结果后,将结果返回给客户端。
通过以上步骤,客户端可以通过Java RMI机制调用远程对象的方法,并获取返回结果。
Java RMI使用Java的序列化机制将方法参数、返回值等信息进行序列化和反序列化,并通过网络进行传输。
这样,Java RMI使得远程通信的过程对开发者透明,就像调用本地方法一样简单。
rmi远程调用工作原理
rmi远程调用工作原理RMI(远程方法调用)是一种用于实现远程通信的Java API。
它允许一个Java对象在不同的Java虚拟机(JVM)之间进行通信和交互。
RMI的工作原理是通过序列化和反序列化来实现的。
在RMI中,有三个主要的角色:远程对象、客户端和服务器。
远程对象是实现了远程接口的Java对象,它可以在不同的JVM之间进行传输和调用。
客户端是发起远程调用的一方,而服务器是提供远程服务的一方。
RMI的工作流程如下:1. 客户端通过查找RMI注册表来获取远程对象的引用。
RMI注册表是一个存储远程对象引用的服务,客户端可以通过查找注册表来获取远程对象的地址。
2. 客户端通过远程对象的引用调用远程方法。
在调用远程方法之前,客户端需要序列化方法的参数,并将序列化后的数据发送给服务器。
3. 服务器接收到客户端发送的请求后,通过反序列化恢复方法的参数,并执行方法体中的代码。
服务器可以访问本地资源,如数据库或文件系统,并根据客户端的请求进行相应的处理。
4. 服务器执行完方法后,将方法的返回值序列化并发送给客户端。
5. 客户端接收到服务器发送的返回值后,通过反序列化恢复返回值,并继续执行后续的代码。
需要注意的是,在RMI中,远程对象和其所在的JVM之间通过网络进行通信。
为了实现远程通信,RMI使用了Java的序列化机制。
序列化是将一个Java对象转换成字节流的过程,而反序列化则是将字节流转换回Java对象的过程。
RMI的序列化机制可以确保远程对象在不同的JVM之间进行传输和重建。
当客户端调用远程方法时,RMI会自动对方法的参数进行序列化,并将序列化后的数据发送给服务器。
服务器在接收到数据后,会进行反序列化,并将参数恢复成原始的Java对象。
同样地,服务器执行完方法后,将返回值序列化并发送给客户端,客户端在接收到返回值后进行反序列化。
RMI的远程调用过程中,序列化和反序列化是必不可少的环节。
通过序列化,RMI可以将Java对象在网络中进行传输,使得远程调用得以实现。
element select remote-method -回复
element select remote-method -回复远程方法调用(Remote Method Invocation,缩写为RMI)是一种用于在分布式系统中实现远程过程调用(Remote Procedure Call,缩写为RPC)的技术。
它允许一个程序在一个网络上的另一个程序上调用方法,并且使得远程方法调用就像本地方法调用一样简单。
在这篇文章中,我们将一步一步回答关于远程方法调用的问题,探讨它的原理、使用场景以及优点。
第一步:什么是远程方法调用(RMI)?远程方法调用是一种允许一个应用程序通过网络在另一个应用程序上调用方法的技术。
它通常用于实现分布式系统中的远程过程调用。
远程方法调用使得开发人员可以像调用本地方法一样调用远程方法,从而简化了分布式系统的开发和管理。
第二步:远程方法调用的原理是什么?远程方法调用的原理基于代理模式。
在RMI中,客户端应用程序通过代理对象代表服务端应用程序,向服务端发送请求。
代理对象在客户端和服务端之间扮演着桥梁的角色,负责处理客户端发出的请求并将其传递给服务端。
服务端接收到请求后执行相应的方法,并将结果返回给客户端。
第三步:远程方法调用的使用场景有哪些?远程方法调用适用于各种分布式系统的场景。
它可以用于构建复杂的分布式架构,例如客户/服务器模型、网格计算和云计算。
远程方法调用还可以用于构建跨平台的应用程序,允许不同的系统和编程语言之间进行通信和交互。
第四步:远程方法调用的优点是什么?远程方法调用具有以下几个优点:1. 分布式系统开发方便:远程方法调用可以将远程过程调用变得和本地方法调用一样简单,提供了一种透明的方式在分布式系统中进行方法调用。
2. 跨平台通信:远程方法调用可以在不同的系统和编程语言之间进行通信和交互,使得跨平台开发变得更加容易。
3. 代码重用和封装:通过使用远程方法调用,可以在分布式系统中实现代码的重用和封装,提高开发效率和代码可维护性。
RMI远程方法调用
Java RMI 技术原理(远程方法调用)Java RMI指的是远程方法调用。
它是一种机制,能够让在某个Java虚拟机上的对象调用另一个Java虚拟机中的对象上的方法。
可以用此方法调用的任何对象必须实现该远程接口。
Java RMI不是什么新技术(JDK1.1就有了),但却是是非常重要的底层技术。
大名鼎鼎的EJB都是建立在RMI基础之上的,现在还有一些开源的远程调用组件,其底层技术也是RMI。
在这个大力吹捧Web Service、SOA的年代,不是每个应用都应该选用笨拙的Web Service组件来实现,有人通过对比测试后,认为RMI是最简单的,在一些小的应用中是最合适的。
在Java中,只要一个类extends了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。
注意:extends了Remote接口的类或者其他接口中的方法若是声明抛出了RemoteException异常,则表明该方法可被客户端远程访问调用。
同时,远程对象必须实现java.rmi.server.UniCastRemoteObject类,这样才能保证客户端访问获得远程对象时,该远程对象将会把自身的一个拷贝以Socket的形式传输给客户端,此时客户端所获得的这个拷贝称为“存根stub”,而服务器端本身已存在的远程对象则称之为“骨架skeleton”。
其实此时的Stub 是客户端的一个代理,用于与服务器端的通信,而Skeleton也可认为是服务器端的一个代理,用于接收客户端的请求之后调用远程方法来响应客户端的请求。
从客户对象经存根(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传输层,向上穿过远程调用层和骨架(Skeleton),到达服务器对象。
Stub扮演着远程服务器对象的代理的角色,使该对象可被客户激活。
RMI调用机制
RMI远程方法调用讲解教程1、RMI概述RMI(Remote Method Invocation)RMI是分布式对象软件包,它简化了在多台计算机上的java应用之间的通信。
必须在jdk1.1以上RMI用到的类java.rmi.Remote所有可以被远程调用的对象都必须实现该接口java.rmi.server.UnicastRemoteObject所有可以被远程调用的对象都必须扩展该类什么是RMI远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程序语法规则和在本地机上对象间的方法调用的语法规则一样。
优点这种机制给分布计算的系统设计、编程都带来了极大的方便。
只要按照RMI规则设计程序,可以不必再过问在RMI之下的网络细节了,如:TCP和Socket 等等。
任意两台计算机之间的通讯完全由RMI负责。
调用远程计算机上的对象就像本地对象一样方便。
1、面向对象:RMI可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。
也就是说,可以将类似Java哈西表这样的复杂类型作为一个参数进行传递。
2、可移动属性:RMI可将属性从客户机移动到服务器,或者从服务器移动到客户机。
3、设计方式:对象传递功能使您可以在分布式计算中充分利用面向对象技术的强大功能,如二层和三层结构系统。
假如用户能够传递属性,那么就可以在自己的解决方案中使用面向对象的设计方式。
所有面向对象的设计方式无不依靠不同的属性来发挥功能,假如不能传递完整的对象——包括实现和类型——就会失去设计方式上所提供的优点。
4、安全性:RMI使用Java内置的安全机制保证下载执行程序时用户系统的安全。
RMI使用专门为保护系统免遭恶意小程序侵害而设计的安全治理程序。
5、便于编写和使用RMI使得Java远程服务程序和访问这些服务程序的Java客户程序的编写工作变得轻松、简单。
oracle remote method invocation复现
oracle remote method invocation复现该问题的解决方案。
远程方法调用(RMI)是一种用于在分布式计算环境中调用远程对象上的方法的方法。
Oracle RMI为Java提供了一个强大的工具包,可以轻松实现远程方法调用的功能。
在本文中,将详细介绍如何使用Oracle RMI 来实现远程方法调用。
本文逐步指导如何实现和使用Oracle RMI,并提供示例代码和实际应用案例。
第一步:创建接口远程方法调用的第一步是创建一个接口,该接口定义了远程对象上可以调用的方法。
这个接口需要扩展java.rmi.Remote接口,并且每个方法都需要声明抛出java.rmi.RemoteException异常。
例如,我们可以创建一个Calculator接口,其中包含加法和减法方法的定义:javaimport java.rmi.Remote;import java.rmi.RemoteException;public interface Calculator extends Remote {public int add(int a, int b) throws RemoteException;public int subtract(int a, int b) throws RemoteException;}第二步:实现远程接口接下来,我们需要创建一个实现远程接口的类。
这个类将负责实现接口中定义的方法。
例如,我们可以创建一个CalculatorImpl类,该类实现了Calculator接口,并提供了相应的加法和减法方法的实现:javaimport java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class CalculatorImpl extends UnicastRemoteObject implements Calculator {public CalculatorImpl() throws RemoteException {super();}public int add(int a, int b) throws RemoteException {return a + b;}public int subtract(int a, int b) throws RemoteException { return a - b;}}请注意,CalculatorImpl类扩展了UnicastRemoteObject类,并在构造函数中调用了super()方法。
element select remote-method -回复
element select remote-method -回复[element select remote method]1. 什么是远程方法调用(Remote Method Invocation,RMI)?远程方法调用(RMI)是一种用于在分布式系统中调用远程对象方法的机制。
它允许在不同的主机上的对象之间进行通信和交互。
RMI是Java 平台的一项核心技术,它提供了一种简单的方法来创建分布式应用程序。
2. RMI的工作原理是什么?RMI的工作原理可以分为四个关键步骤:远程接口定义、远程对象实现、远程对象注册和远程对象调用。
- 首先,我们需要定义一个远程接口,其中声明了客户端可以调用的方法。
- 然后,在服务器端实现该远程接口的一个具体对象。
这个实现类将包含真正的业务逻辑和方法。
- 接下来,服务器将注册远程对象,使得客户端能够在服务器上访问它。
这可以通过使用RMI注册表或RMI命名服务来实现。
- 最后,客户端通过查找并获取远程对象的引用,并通过该引用来调用远程对象的方法。
3. RMI和其他远程调用技术的区别是什么?RMI与其他远程调用技术(如Web服务和CORBA)相比具有一些明显的区别:- RMI是一种Java特定的远程调用技术,它仅适用于Java平台。
而其他技术如Web服务和CORBA是跨平台的,可以在不同的编程语言和平台之间进行通信。
- RMI支持接口参数的传递,这意味着客户端和服务器可以共享相同的接口定义。
而其他技术更注重于传输数据。
- RMI使用Java对象序列化来传输数据,而其他技术如Web服务和CORBA通常使用XML或二进制数据格式。
- RMI提供了更高级别的抽象,使得远程调用变得更加简单和直观。
而其他技术可能需要更多的配置和编码。
4. 如何实现RMI?要实现RMI,需要执行以下步骤:- 首先,定义一个远程接口,并使用Java接口来声明可供远程调用的方法。
- 然后,在服务器端实现该接口的具体类。
Java远程方法调用RMI参数详解
Java远程方法调用RMI参数详解Java 远程方法调用RMI参数详解1、概述根据RMI参数意义,可以归结为以下几点,我们可以根据这几点通过优化GC, 网络等待,流传输协议(http/rmi special socket)等方面来优化RMI。
同时,根据RMI的若干log配置,可以做到实时监控RMI网络,GC信息,针对实时监控的情况,有效地优化RMI参数设置。
2、主要参数2.1、sun.rmi.dgc.checkInterval查询契约间隔时间The value of this property represents (in milliseconds) how often the Java RMI runtime checks for expired DGC leases. The default value is half the value of the java.rmi.dgc.leaseValue property.优化:尽早的删除引用有利于管理内存,但leaseValue太短的话又会造成网络风险。
这一点可根据本身的网络情况作优化。
2.2、java.rmi.dgc.leaseValue契约时长The value of this property represents the lease duration (in milliseconds) granted to other VMs that hold remote references to objects which have been exported by this VM. Clients usually renew a lease when it is 50% expired, so a very short value will increase network traffic and risk late renewals in exchange for reduced latency in calls to Unreferenced.unreferenced. The default value of this property is 600000 milliseconds (10 minutes).优化:尽早的删除引用有利于管理内存,但leaseValue太短的话又会造成网络风险。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RMI是远程方法调用的简称,象其名称暗示的那样,它能够帮助我们查找并执行远程对象的方法。
通俗地说,远程调用就象将一个class放在A机器上,然后在B机器中调用这个class的方法。
我个人认为,尽管RMI不是唯一的企业级远程对象访问方案,但它却是最容易实现的。
与能够使不同编程语言开发的CORBA不同的是,RMI是一种纯Java 解决方案。
在RMI中,程序的所有部分都由Java编写。
在看本篇文章时,我假定读者都已经具备了较扎实的Java基础知识,在这方面有欠缺的读者请自行阅读有关资料。
概念我在前面已经提到,RMI是一种远程方法调用机制,其过程对于最终用户是透明的:在进行现场演示时,如果我不说它使用了RNI,其他人不可能知道调用的方法存储在其他机器上。
当然了,二台机器上必须都安装有Java虚拟机(JVM)。
其他机器需要调用的对象必须被导出到远程注册服务器,这样才能被其他机器调用。
因此,如果机器A要调用机器B上的方法,则机器B必须将该对象导出到其远程注册服务器。
注册服务器是服务器上运行的一种服务,它帮助客户端远程地查找和访问服务器上的对象。
一个对象只有导出来后,然后才能实现RMI 包中的远程接口。
例如,如果想使机器A中的Xyz对象能够被远程调用,它就必须实现远程接口。
RMI需要使用占位程序和框架,占位程序在客户端,框架在服务器端。
在调用远程方法时,我们无需直接面对存储有该方法的机器。
在进行数据通讯前,还必须做一些准备工作。
占位程序就象客户端机器上的一个本机对象,它就象服务器上的对象的代理,向客户端提供能够被服务器调用的方法。
然后,Stub就会向服务器端的Skeleton发送方法调用,Skeleton就会在服务器端执行接收到的方法。
Stub和Skeleton之间通过远程调用层进行相互通讯,远程调用层遵循TCP/IP协议收发数据。
下面我们来大致了解一种称为为“绑定”的技术。
客户端无论何时要调用服务器端的对象,你可曾想过他是如何告诉服务器他想创建什么样的对象吗?这正是“绑定”的的用武之地。
在服务器端,我们将一个字符串变量与一个对象联系在一起(可以通过方法来实现),客户端通过将那个字符串传递给服务器来告诉服务器它要创建的对象,这样服务器就可以准确地知道客户端需要使用哪一个对象了。
所有这些字符串和对象都存储在的远程注册服务器中。
在编程中需要解决的问题在研究代码之前,我们来看看必须编写哪些代码:远程对象:这个接口只定义了一个方法。
我们应当明白的是,这个接口并非总是不包括方法的代码而只包括方法的定义。
远程对象包含要导出的每个方法的定义,它还实现Java.rmi中的远程接口。
远程对象实现:这是一个实现远程对象的类。
如果实现了远程对象,就能够覆盖该对象中的所有方法,因此,远程对象的实现类将真正包含我们希望导出的方法的代码。
远程服务器:这是一个作为服务器使用的类,它是相对于要访问远程方法的客户端而言的。
它存储着绑定的字符串和对象。
远程客户端:这是一个帮助我们访问远程方法提供帮助的类,它也是最终用户。
我们将使用查找和调用远程方法的方法在该类中调用远程方法。
编程我们将首先编写远程对象,并将代码保存为名字为AddServer.Java的文件:import Java.rmi.*;public interface AddServer extends Remote {public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException;}我们来看看上面的代码。
首先,为了使用其内容,我们导入rmi包。
然后,我们创建一个扩展了Java.rmi中远程接口的接口。
所有的远程对象必须扩展该远程接口,我们将该远程接口称为AddServer。
在该远程对象中,有一个名字为AddNumbers的方法,客户端可以调用这一方法。
我们必须记住的是,所有的远程方法都需要启动RemoteException方法,有错误发生时就会调用该方法。
下面我们开始编写远程对象的实现。
这是一个实现远程对象并包含有所有方法代码的类,将下面的代码保存为名字为AddServerImpl.Java的文件:import Java.rmi.*;public class AddServerImpl extends UnicastRemoteObject implements AddServer {public AddServerImpl() {super();}public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException {return firstnumber + secondnumber;}}首先,我们导入rmi包,然后创建一个扩展UnicastRemoteObject和实现创建的远程对象的类;其次,我们可以为类创建一个缺省的构建器。
我们还了解了AddNumbers方法的代码,它启动RemoteException。
这样我们就覆盖了创建的远程对象中的方法。
AddNumbers方法的代码非常好理解,它接受2个整型参数,然后相加并返回它们的和。
至此,我们已经有了二个Java文件:远程对象和远程对象的实现。
下面我们将使用Javac命令编译这二个文件:编译远程对象:C:\jdk\bin\Javac workingdir\AddServer.Java编译远程对象实现:C:\jdk\bin\Javac workingdir\AddServerImpl.Java 这样,就会达到二个Java文件和二个类文件,下面我们将创建stub和skeleton。
为了创建stub和skeleton文件,我们必须使用rmic编译器编译远程对象实现文件。
用Rmic编译远程对象实现文件:C:\jdk\bin\rmic workingdir\AddServerImpl 然后,我们就会发现多了2个新建的类文件,它们分别是AddServerImpl_Stub.class 和AddServerImpl_Skel.class 。
我们已经编译了所有的源代码,下面我们来创建客户端和服务器端,将下面的代码保存为名字为RmiServer.Java的文件:import Java.rmi.*;import .*;public class RmiServer {public static void main (String args[]) throws RemoteException, MalformedURLException {AddServerImpl add = new AddServerImpl();Naming.rebind("addnumbers",add);}}首先,我们导入Java.rmi包和包。
另外,我们还使用throws从句捕获任何异常。
我们从对象中得出远程对象实现,使用rebind方法将字符串addnumbers与该对象绑定。
下面的例子显示了绑定的含义:从现在开始,无论何时客户端要调用远程对象,使用字符串addnumbers就可以实现。
rebind方法有二个参数:第一个参数是字符串变量,第二个参数是远程对象实现类的对象。
下面我们来创建客户端,将下面的代码保存为名字为RmiClient.Java的文件:import Java.rmi.*;import .*;public class RmiClient {public static void main(String args[]) throws RemoteException, MalformedURLException {String url="rmi://127.0.0.1/addnumbers";AddServer add;add = (AddServer)Naming.lookup(url);int result = add.AddNumbers(10,5);System.out.println(result);}}首先,我们导入Java.rmi包和包,并使用throws从句捕获所有必要的异常。
然后通过利用Naming类中的静态lookup方法从远程对象中得到一个对象。
(这也是我们无需从Naming类中得到一个对象并调用它。
而只使用类名字的原因。
)lookup方法接受远程对象的完整的URL名字,该URL由完整的机器IP地址以及与对象绑定的字符串(也征对象的绑定名)组成。
在调用远程对象时,我们使用了RMI协议。
lookup方法向我们返回一个对象,在能够使用它前,我们必须将它的数据类型转换为与远程对象的数据类型一致。
Since we have both our server and client source ready, let's compile them both:至此,我们已经有了服务器端和客户端的源代码,下面我们来编译这二个源文件:编译远程服务器:C:\jdk\bin\Javac workingdir\RmiServer.Java编译远程客户端:C:\jdk\bin\Javac workingdir\RmiClient.Java在对我们的代码进行测试前,还必须首先启动RMI Registry。
RMI Registry 存储有所有绑定的数据,没有它,RMI就不能正常地运行!启动Rmi Registry服务器:C:\jdk\bin\start rmiregistry我们会注意到,这时会出现一个空白的DOS提示符窗口,这表明Rmi Registry服务器在运行,注意不要关闭该窗口。
然后,我们首先在一个DOS提示符窗口中运行Rmi服务器,然后在另一个DOS提示符窗口中运行Rmi客户端。
启动RMI服务器:C:\jdk\bin\Java workingdir\RmiServer启动RMI客户端:C:\jdk\bin\Java workingdir\RmiClient如果一切正常,我们应该能够得到15这个输出。
我们向AddNumbers方法输入10和5二个数字,该方法将这二者加起来,并将其和15返回给我们。
如果得到了15这个输出,说明我们已经成功地执行了一个远程方法。
当然,在这里,我们并没有执行真正意义上的远程方法,因为我们的计算机既是服务器,又是客户机。
如果有计算机网络,我们就可以方便地进行执行远程方法的试验了。
===================================================================== ======RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans 的支柱,是建立分布式Java应用程序的方便途径。