java RMI入门指南
Posted yxwkaifa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java RMI入门指南相关的知识,希望对你有一定的参考价值。
感觉这篇文章不错,直接转了
RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体如今它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方式之中的一个。事实上它能够被看作是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,执行环境)的平台上。但因为JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。
RMI可利用标准Java本机方法接口JNI与现有的和原有的系统相连接。RMI还可利用标准JDBC包与现有的关系数据库连接。
RMI/JNI和RMI/JDBC相结合,可帮助您利用RMI与眼下使用非Java语言的现有server进行通信,并且在您须要时可扩展Java在这些server上的使用。RMI可帮助您在扩展使用时充分利用Java的强大功能。
一、RMI(远程方法调用)的组成
一个正常工作的RMI系统由以下几个部分组成:
·远程服务的接口定义
·远程服务接口的详细实现
·桩(Stub)和框架(Skeleton)文件
·一个执行远程服务的server
·一个RMI命名服务。它同意client去发现这个远程服务
·类文件的提供者(一个HTTP或者FTPserver)
·一个须要这个远程服务的client程序
二、RMI(远程方法调用)原理示意图
方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 输层。向上穿过远程调用层和骨干网(Skeleton),到达server对象。
占位程序扮演着远程server对象的代理的角色。使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个server还是多个。
传输层管理实际的连接,而且追踪能够接受方法调用的远程对象。
server端的骨干网完毕对server对象实际的方法调用,并获取返回值。返回值向下经远程引用层、server端的传输层传递回client。再向上经传输层和远程调用层返回。最后。占位程序获得返回值。
要完毕以上步骤须要有下面几个步骤:
1、 生成一个远程接口
2、 实现远程对象(server端程序)
3、 生成占位程序和骨干网(server端程序)
4、 编写server程序
5、 编写客户程序
6、 注冊远程对象
7、 启动远程对象
三、RMI(远程方法调用)的长处
从最主要的角度看。RMI是Java的远程过程调用(RPC)机制。与传统的RPC系统相比。RMI具有若干长处。由于它是Java面向对象方法的一部分。传统的RPC系统採用中性语言,所以是最普通的系统--它们不能提供全部可能的目标平台所具有的功能。
RMI以Java为核心。可与採用本机方法与现有系统相连接。这就是说,RMI可採用自然、直接和功能全面的方式为您提供分布式计算技术,而这样的技术可帮助您以不断递增和无缝的方式为整个系统加入Java功能。
RMI的主要长处例如以下:
面向对象:RMI可将完整的对象作为參数和返回值进行传递,而不不过提前定义的数据类型。
也就是说。您能够将类似Java哈希表这种复杂类型作为一个參数进行传递。而在眼下的RPC系统中,您只能依靠客户机将此类对象分解成基本数据类型。然后传递这些数据类型,最后在server端又一次创建哈希表。RMI则不需额外的客户程序代码(将对象分解成基本数据类型),直接跨网传递对象。
可移动属性:RMI可将属性(类实现程序)从客户机移动到server,或者从server移到客户机。这样就能具备最大的灵活性,由于政策改变时仅仅须要您编写一个新的Java类,并将其在server主机上安装一次就可以。
设计方式:对象传递功能使您能够在分布式计算中充分利用面向对象技术的强大功能。如二层和三层结构系统。假设您能够传递属性,那么您就能够在您的解决方式中使用面向对象的设计方式。全部面向对象的设计方式无不依靠不同的属性来发挥功能,假设不能传递完整的对象--包含实现和类型--就会失去设计方式上所提供的长处。
安 全:RMI使用Java内置的安全机制保证下载运行程序时用户系统的安全。
RMI使用专门为保护系统免遭恶意小应用程序侵害而设计的安全管理程序。可保护您的系统和网络免遭潜在的恶意下载程序的破坏。在情况严重时,server可拒绝下载不论什么运行程序。
便于编写和使用:RMI使得Java远程服务程序和訪问这些服务程序的Java客户程序的编写工作变得轻松、简单。远程接口实际上就是Java接口。服务程序大约用三行指令宣布本身是服务程序,其他方面则与不论什么其他Java对象类似。
这样的简单方法便于高速编写完整的分布式对象系统的服务程序,并高速地制做软件的原型和早期版本号,以便于进行測试和评估。由于RMI程序编写简单,所以维护也简单。
可连接现有/原有的系统:RMI可通过Java的本机方法接口JNI与现有系统进行进行交互。
利用RMI和JNI,您就能用Java语言编写client程序,还能使用现有的server端程序。
在使用RMI/JNI与现有server连接时,您能够有选择地用Java又一次编写服务程序的不论什么部分,并使新的程序充分发挥Java的功能。
类似地。RMI可利用JDBC、在不改动使用数据库的现有非Java源码的前提下与现有关系数据库进行交互。
编写一次。到处执行:RMI是Java“编写一次,到处执行 ”方法的一部分。不论什么基于RMI的系统均可100%地移植到不论什么Java虚拟机上,RMI/JDBC系统也不例外。假设使用RMI/JNI与现有系统进行交互工作,则採用JNI编写的代码可与不论什么Java虚拟机进行编译、执行。
分布式垃圾收集:RMI採用其分布式垃圾收集功能收集不再被网络中不论什么客户程序所引用的远程服务对象。与Java 虚拟机内部的垃圾收集类似。分布式垃圾收集功能同意用户依据自己的须要定义server对象。而且明白这些对象在不再被客户机引用时会被删除。
并行计算:RMI採用多线程处理方法。可使您的server利用这些Java线程更好地并行处理client的请求。Java分布式计算解决方式:RMI从JDK 1.1開始就是Java平台的核心部分,因此。它存在于不论什么一台1.1 Java虚拟机中。全部RMI系统均採用同样的公开协议,所以。全部Java 系统均可直接相互对话。而不必事先对协议进行转换。
四、RMI与CORBA的关系
RMI 和 CORBA 常被视为相互竞争的技术。由于两者都提供对远程分布式对象的透明訪问。但这两种技术实际上是相互补充的。一者的好处正好能够弥补还有一者的短处。RMI 和 CORBA 的结合产生了 RMI-IIOP,RMI-IIOP 是企业server端 Java 开发的基础。
1997 年,IBM 和 Sun Microsystems启动了一项旨在促进 Java 作为企业开发技术的发展的合作计划。两家公司特别着力于怎样将 Java 用作server端语言。生成能够结合进现有体系结构的企业级代码。
所须要的就是一种远程传输技术。它兼有 Java 的 RMI(Remote Method Invocation,远程方法调用)较少的资源占用量和更成熟的 CORBA(Common Object Request Broker Architecture。公共对象请求代理体系结构)技术的健壮性。
出于这一须要,RMI-IIOP问世了,它帮助将 Java 语言推向了眼下server端企业开发的主流语言的率先地位。
(来源:sun。matrix.org.cn)
Java RMI 简单演示样例一
下面用一个最简单的Hello的演示样例来介绍RMI的应用。
1:定义一个远程接口
IHello.java代码例如以下:
public interface IHello extends Remote {
public String sayHello(String name) throws java.rmi.RemoteException;
}
2:实现远程的接口(服务端就在此远程接口的实现类中)
HelloImpl.java代码例如以下:
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements IHello {
// 这个实现必须有一个显式的构造函数。而且要抛出一个RemoteException异常
protected HelloImpl() throws RemoteException {
super();
}
/**
* 说明清楚此属性的业务含义
*/
private static final long serialVersionUID = 4077329331699640331L;
public String sayHello(String name) throws RemoteException {
return "Hello " + name + " ^_^ ";
}
public static void main(String[] args) {
try {
IHello hello = new HelloImpl();
java.rmi.Naming.rebind("rmi://localhost:1099/hello", hello);
System.out.print("Ready");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3:新建RMIclient调用程序
Hello_RMI_Client.java代码例如以下:
public class Hello_RMI_Client {
public static void main(String[] args) {
try {
IHello hello = (IHello) Naming.lookup("rmi://localhost:1099/hello");
System.out.println(hello.sayHello("zhangxianxin"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
4:编译并执行
4.1 用javac命令编译IHello.java、HelloImpl.java、Hello_RMI_Client.java
>javac *.java
4.2 用rmic命令生成桩和框架文件
>rmic HelloImpl
成功执行完上面的命令能够发现生成一个HelloImpl_stub.class文件,假设JDK是使用Java2SDK。那么还能够发现多出一个HelloImpl_Skel.class文件。假设服务端程序与client程序在同一台机器上并在同一文件夹中,则能够省略掉接口实现类生成的桩和框架文件,但这就失去了使用RMI的意义。而假设要在不同的JVM上执行时。client程序就必须得依靠服务端运程方法实现的桩和框架文件以及接口类。
4.3 执行注冊程序RMIRegistry,必须在包括刚写的类的文件夹下执行这个注冊程序。
>rmiregistry
注冊程序開始执行了,不要管他,如今切换到另外一个控制台执行server
4.4 执行serverHelloImpl
>java
以上是关于java RMI入门指南的主要内容,如果未能解决你的问题,请参考以下文章