RMI(第海是影调清Remote Meth尔笔材身od Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时计的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI移输笑体温做就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则面战属深族支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间凯京伤诉绍的无缝远程调用。
- 外文名称 JavaRMI
- 运行平台 使用Java远程消息交换协议JRMP
- 优势 用Java 编写的组件的连接
- 计算途径 RMI为采用Java对象的分布式计算
- 性能优越 允许您使用Java编写分布式对象
定义
RM古作I(Remote Method Invocation,远程方法调用)是用Java在来自JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种360百科风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网谓移然慢策销核存概布络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。县其实它可以被看作是RPC的Java版本。但是传统R慢革尼能冲灯院科评乎条PC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间争彼此进行通信,实现远程对象之间的无缝远程调用。
工作方式
运行平台
RMI目前(Java Remote Messaging Protocol)进行通信。J言重迅体波RMP是专为Java的远程对象制定的协议。因此,Java RMI具有J批委便ava的"Write Onc查乐e,Run Anyw议究阶逐包础北肥听兵县here"的优点,是分布式应用系统的百分之百纯Jav大续钱协a解决方案。用Java RMI专开发的应用系统可以部署在任何支法核持JRE(Java Run 垂器脱委乎继内内阳斗造Environmen映鲜云械反情一t Java,运行环境)的平台上。但由于JRMP是专为Java对象制定的屋就力口沙且轻你,因此,RMI对附于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。
Java Remote Method Invocation (RMI -- Java远程水运古住守段足径道方法调用)。下面将介绍RMI的优点以及如何将其连接到现有的和原有的系统中,以及与。
计算途径
提供了简单而直接的任思度途径。这些对象可以是新的Java对象,也可以是围绕现有API的简单的Java包装程序。Java体现了"编写一次就能在任何地方运行的模式。而RMI可将Java模式进行扩展,使之可在任何地方运行"。
因为RMI是以Java为核心的,所以,它将Java的安全性和可移植性等强大功能带给了分布式计算。您可将代理和业务逻辑等属性移动到网络中最合适的地方。如果您要扩展Java在系统中的使用,RMI将使您充分利用其强大功能。
RMI还可利用标准JDBC包与现有的关系数据库连接。RMI/JNI和RMI/JDBC相结合,可帮助您利用RMI与目前使用非Java语言的现有服务器进行通信,而且在您需要时可扩展Java在这些服务器上的使用。RMI可帮助您在扩展使用时充分利用Java的强大功能。
RMI客户机类
RMI客户使用java.rmi.Naming.lookup()方法,在指定的远程主机上查找RMI服务对象,唱氢神集批同合齐超若找到就把它转换成本地接口RMIOperate类型。它与CORBA不同之处在于RMI客户机必须知来自道提供RMI服务主机的URL,这个URL可以通360百科过rmi://host/path或rmi:/态蒸划亚/host:port/path来指定,如果省略端口号,就默认使用1099。
Java.rmi.Naming.lookup()方法可能产生三个异常:Java.rmi.RemoteException、Java心基蒸家旧.rmi.NotBoundException、 MalformedURLException,异常都需要捕获。
Hel希星谓满有史loClient.java
/*
* @autho止井误都落集衡夜r javamxj (CSDN Blog) 创建日期 2004-12-27
*/
import java.rmi.*;
public class HelloClient {
public static void main(String[] args) {
// 在服务器端设置安全机制
/*
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISec规urityManager());
均大巴百假}
*/
/* 默认为本地主机和默认端口 */
String host = "localhost:1099";
/* 带输入参数时,了小身指将host设置为指定主机 */
if (args.length > 0)
host = args[0];
try {
/* 根据指定的URL定位远程实现对并象 */
/* "h"是一个标识符,我们将用它指向实现"Hello"接口的远程对象 */
Hello h = (Hello) Naming.look飞测后成散轻创达者up("rmi://" + host + "/Hel密loService");
System.out.println("实现"Hello"接口消伤也胡友才了控百的远程对象: " + h讲胶夫);
System.out.println("我在客户端,开始调用RMI服务器端的'sayHello'方法");
System.out.println("欢迎, " + h.sayHello("javamxj blog"));
} catch (Exceptio谓呀看阿房溶亮别n ex) {
System.out.println("错误 " + 息断时叶促规攻ex);
}
}
非才编译代码与运行系统
在MS-DOS环境下,创建一个D质阶错两展决坐:\RMISam况ple目录,把上面4个文件复制到这个目录下,然后在此目录下新建两个文件夹:client和server(把它们分别看作是客户端与服务端)。
(1).编译所有的源代码
D:\RMISample> javac ja(2).生成客户端存根和服务器框架
D:\RMISample> rmic HelloImpl
这将生成HelloImpl_Stub.class和HelloImpl_Skel.class。
( 注:如果需要查看这两个类的源代码,可以使用" rmic -keep HelloImpl"语句)
(3).把Hello.class、HelloClient.class、HelloImpl_Stub.class复制到client目录;
把Hello.class、HelloServer.class、HelloImpl_Skel.class、HelloImpl_Stub.class 复制到server目录。
(4).启动RMI注册
D:\RMISample\server>rmiregistry
(注: 我是在命令控制台下运行这个系统的,必须开启三个控制台窗口,一个运行RMIRegistry,一个运行服务器,还有一个运行客户端。)
(5).运行和调用
● 在服务器上执行HelloServer
D:\RMISample\server>java HelloServer
● 在本地客户机上运行HelloClient
D:\RMISample\client>java HelloClient
● 在远程客户机上运行HelloClient(须指明RMI服务器主机名或IP地址)
java HelloClient 222.222.34.34
运行rmiregistry和server后的结果:
再运行Client后的结果:
还有一点要注意,在上面的例子中我注释了安全管理的代码,如果把注释去掉,那么需要建立一个安全策略文件,比如其文件名为 policy.txt,内容如下:
grant {
permission java.security.AllPermission "", "";
};
这是一条简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。把这个文件复制到Client和Server目录,然后如下运行:
D:\RMISample\server>java -Djava.security.policy=policy.txt HelloServer
D:\RMISample\client>java -Djava.security.policy=policy.txt HelloClient