RMI(Remote Method Invocation,
远程方法调用)是用Java在JDK1.2中实现的,它大大增强了
Java开发
分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络
分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于
分布式对象系统。而Java RMI 则支持
存储于不同
地址空间的程序级对象之间彼此进行通信,实现
远程对象之间的无缝远程调用。
定义
RMI(Remote Method Invocation,
远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发
分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统
RPC并不能很好地应用于
分布式对象系统。而Java RMI 则支持存储于不同
地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
工作方式
运行平台
RMI目前(Java Remote Messaging Protocol)进行通信。JRMP是专为Java的
远程分布式应用系统的百分之百纯Java解决方案。用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment 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可以通过rmi://host/path或rmi://host:port/path来指定,如果省略
端口号,就默认使用1099。
Java.rmi.Naming.lookup()方法可能产生三个异常:Java.rmi.RemoteException、Java.rmi.NotBoundException、 MalformedURLException,异常都需要捕获。
HelloClient.java
/*
* @author 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 RMISecurityManager());
}
*/
/* 带输入参数时,将host设置为指定主机 */
if (args.length > 0)
host = args[0];
try {
/* “h”是一个标识符,我们将用它指向实现“Hello”
接口的远程对象 */
} catch (Exception ex) {
}
}
代码与运行
编译代码与运行系统
这将生成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注册
(注: 我是在命令控制台下运行这个系统的,必须开启三个控制台窗口,一个运行RMIRegistry,一个运行
服务器,还有一个运行客户端。)
(5).运行和调用
● 在服务器上执行HelloServer
● 在本地客户机上运行HelloClient
● 在
远程客户机上运行HelloClient(须指明RMI服务器
主机名或IP地址)
java HelloClient 222.222.34.34
运行
rmiregistry和server后的结果:
再运行Client后的结果:
还有一点要注意,在上面的例子中我注释了安全管理的代码,如果把注释去掉,那么需要建立一个安全策略文件,比如其文件名为 policy.txt,内容如下:
grant {
};
这是一条简单的安全策略,它允许任何人做任何事,对于你的更加关键性的应用,你必须指定更加详细安全策略。把这个文件复制到Client和Server目录,然后如下运行: