远程方法调用——RMI

RMI

RMI  (Remote  Method  Invocation)是Java用于实现透明远程调用的重要机制。在远程调用中,客户端仅有服务器端提供的接口 。通过此接口实现对远程服务器端的调用。其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

Sun  JDK  6 .0 以前版本中的R M I 实现均是基于TCP/IP+BIO 方式的,RMI 服务器端通过启动RMI 注册对象在一个端口上监听对外提供的接口,其实现实例以字符串的方式绑定到RMI 注册对象上。RMI客户端通过Proxy的方式代理了对服务器端接口的访问,RMI 客户端将要访问的服务器端对象字符串、方法和参数封装成一个对象,序列化成流后通过TCP/IP + BIO 传输到 RMI 服务器端。RMI 服务器端接收到客户端的请求对象后,解析其中的对象字符串、方法及参数,通过对象字符串从
RMI 注册对象上找到提供业务功能的实例,之后结合要访问的方法来反射获取到方法实例对象,传入参数完成对服务器端对象实例的调用,返回的结果则序列化为流以 TCP/IP + BIO 方式返回给客户端,客户端在接收到此流后反序列化为对象,并返冋给调用者。

简单例子

远程调用接口:

/**
 * 远程接口<br/>
 * 定义一个远程接口,必须继承Remote接口
 *
 * @author Joeson
 * @since 07/2014
 */
public interface HelloRMI extends Remote
{
	// 其中需要远程调用的方法必须抛出RemoteException异常
	public String hello() throws RemoteException;
}

远程调用接口实现:

/**
 *
 * 远程调用实现类<br/>
 * 需要继承UnicastRemoteObject类,同时因为UnicastRemoteObject的构造方法抛出了RemoteException异常,
 * 因此这里默认的构造方法必须写,必须声明抛出RemoteException异常。
 *
 * @author Joeson
 * @since 07/2014
 *
 */
public class HelloRMIImpl extends UnicastRemoteObject implements HelloRMI
{

	public HelloRMIImpl() throws RemoteException
	{
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	public String hello() throws RemoteException
	{
		return "Hello, RMI";
	}

}

RMI服务器端:

/**
 * RMI服务器端<br/>
 *
 *
 * @author Joeson
 * @since 07/2014
 *
 */
public class ServerRMI
{

	public static void main(String[] args)
	{
		try
		{
			// 创建一个远程对象
			HelloRMI hello = new HelloRMIImpl();
			// 本地主机上的远程对象注册表Registry的实例,并指定端口为8080,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上
			LocateRegistry.createRegistry(8080);

			// 把远程对象注册到RMI注册服务器上,并命名为Hello, 绑定的URL标准格式为:rmi://host:port/name
			Naming.bind("rmi://localhost:8080/Hello", hello);
			System.out.println("RMI服务启动...");

		} catch (RemoteException e)
		{
			System.out.println("创建远程对象发生异常!");
		} catch (AlreadyBoundException e)
		{
			System.out.println("发生重复绑定对象异常!");
			e.printStackTrace();
		} catch (MalformedURLException e)
		{
			System.out.println("发生URL畸形异常!");
			e.printStackTrace();
		}
	}
}

RMI客户端实现:

/**
 * RMI客户端<br/>
 *
 * @author Joeson
 * @since 07/2014
 *
 */
public class ClientRMI
{
	public static void main(String args[])
	{
		try
		{
			// 在RMI服务注册表中查找名称为Hello的对象,并调用其上的方法
			HelloRMI hello = (HelloRMI) Naming
					.lookup("rmi://localhost:8080/Hello");
			System.out.println(hello.hello());
		} catch (NotBoundException e)
		{
			e.printStackTrace();
		} catch (MalformedURLException e)
		{
			e.printStackTrace();
		} catch (RemoteException e)
		{
			e.printStackTrace();
		}
	}
}

运行结果

以上就是一个客户端通过RMI方式调用服务器端的是实现,实现分布式系统调用,而RMI的底层的真正实现就在于反射机制、序列化、反序列化和Socket编程,客户端并不需要提供具体的实现,而是通过接口的方式与服务器端的具体实现进行交互,调用服务器端具体的实现,实现客户端想要的效果,这就是分布式系统的业务处理模型了

远程方法调用——RMI,布布扣,bubuko.com

时间: 2024-08-05 23:40:32

远程方法调用——RMI的相关文章

远程方法调用(RMI)

什么是RMI? Java远程方法调用(Java RMI)是Java API对远程过程调用(RPC)提供的面向对象的等价形式,支持直接传输序列化的Java对象和分布式垃圾回收.远程方法调用可以看做是激活远程正在运行的对象上的方法的步骤.RMI对调用者是位置透明的,因为调用者感觉方法是执行在本地运行的对象上的.看下RMI的一些注意事项. RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中

基于zookeeper的远程方法调用(RMI)的实现

采用zookeeper的命令服务,采用不同的目录结构存储不同模块不同服务的rmi的url,使用key来对应不同的服务.同时采用zookeeper解决了单点问题. 当有两个相同的服务注册时,因为采用的是临时有序znode,也会注册成功,客户端在调用时,发现有多个不同url,则会随机调取一个使用. 当一个服务down时,zookeeper会通知客户端更新url缓存,从而去掉down服务的链接.加入时,也会同步客户端url数据. 原理图如下: 1).目录结构 2).zookeeper调用 3).分布式

servlet,RMI,webservice之间的区别

最近项目中有提供或者调用别的接口,在纠结中到底是用servlet还是用webservice,所以上网查看了下他们以及RMI之间的区别,方便加深了解. 首先比较下servlet和webservice下  请求:     servlet:提供了请求/响应模式,是JAVA的一种规范,只能使用于java上,用来替代早期使用的难懂的CGI,是一种无状态的请求响应,客户端访问一个服务器的url,只需要发送简单的httprequest即可. 规定了四个范围:pageContext.request.sessio

servelet,webservice,RMI的区别

最近项目中有提供或者调用别的接口,在纠结中到底是用servlet还是用webservice,所以上网查看了下他们以及RMI之间的区别,方便加深了解. 首先比较下servlet和webservice下  请求:     servlet:提供了请求/响应模式,是JAVA的一种规范,只能使用于java上,用来替代早期使用的难懂的CGI,是一种无状态的请求响应,客 户端访问一个服务器的url,只需要发送简单的httprequest即可. 规定了四个范围:pageContext.request.sessi

RPC与RMI的区别

分布式项目按照以下发展经历了以下技术: CORBA: RMI:基于远程接口的调用 RMI-RROP:这是RMI与CORBA的结合,用在了EJB技术上,EJB留给世界上是优秀的理论和糟糕的架构. WEBSERVICE:等于XML(WSDL)+SOAP   缺点:速度太慢,处理速度太慢了:如果采用远程接口调用,要生成一堆的配置文件,很繁琐. SOA技术:ESB(服务总线))技术 RPC技术:dubbo.利用rest实现RPC,这样的操作,速度很快,占用网络带宽较少,springcloud出现,spr

分布式系列五: RMI通信

RPC(Remote Procedure Call)协议 RPC协议是一种通过网络从远程计算机上请求服务, 而不需要了解底层网络技术的协议, 在OSI模型中处在应用层和网络层. 作为一个规范, 使用RPC协议的框架有很多, Dubbo,Hessian等均使用这个协议, RMI也使用该协议实现. RMI(Remote Method Invocation) 远程方法调用 RMI使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信,JRMP是纯j

JAVA面试题和答案(二)

本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Java和它的功能的常见问题,Java的集合类,垃圾收集器,第二篇主要讨论异常处理,Java小应用程序,Swing,JDBC,远程方法调用(RMI),Servlet和JSP. 开始! 目录 面向对象编程(OOP) 常见的Java问题 Java线程 Java集合类 垃圾收集器 面向对象编程(OOP) Java是一个支持

漫谈Java程序设计中的接口应用

Java语言提供了一种接口(interface)机制.这种接口机制使Java的面向对象编程变得更加灵活.我们可以用接口来定义一个类的表现形式,但接口不能包含任何实现.在<Thinking in Java>一书中,作者对接口有这样的描述:“接口(interface)比抽象(abstract)的概念更进了一步.你可以把一个接口看成是一个纯的抽象类.”我认为作者对接口的这一解释再准确不过了. 理解并用好接口机制将帮助我们更好的掌握Java这种面向对象的编程语言.下面我们来讨论一下接口的使用规则以及相

java serialize 浅谈

对象的串行化(Serialization) 一.串行化的概念和目的 1.什么是串行化             对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(persistence).对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) .串行化的主要任务是写出对象实例变量的数值.如果交量是另一对象的引用,则引用的对象也要串