词条 | JavaRMI |
释义 | 定义RMI(Remote Method Invocation,远程方法调用)是用Java在JDK1.2中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯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语言书写的对象进行通信。 优势Java Remote Method Invocation (RMI -- Java远程方法调用)允许您使用Java编写分布式对象。下面将介绍RMI的优点以及如何将其连接到现有的和原有的系统中,以及与用Java 编写的组件的连接。 计算途径RMI为采用Java对象的分布式计算提供了简单而直接的途径。这些对象可以是新的Java对象,也可以是围绕现有API的简单的Java包装程序。Java体现了“编写一次就能在任何地方运行的模式。而RMI可将Java模式进行扩展,使之可在任何地方运行”。 性能优越因为RMI是以Java为核心的,所以,它将Java的安全性和可移植性等强大功能带给了分布式计算。您可将代理和业务逻辑等属性移动到网络中最合适的地方。如果您要扩展Java在系统中的使用,RMI将使您充分利用其强大功能。 连接方便RMI可利用标准Java本机方法接口JNI与现有的和原有的系统相连接。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()); } */ /* 默认为本地主机和默认端口 */ String host = "localhost:1099"; /* 带输入参数时,将host设置为指定主机 */ if (args.length > 0) host = args[0]; try { /* 根据指定的URL定位远程实现对象 */ /* “h”是一个标识符,我们将用它指向实现“Hello”接口的远程对象 */ Hello h = (Hello) Naming.lookup("rmi://" + host + "/HelloService"); System.out.println("实现“Hello”接口的远程对象: " + h); System.out.println("我在客户端,开始调用RMI服务器端的'sayHello'方法"); System.out.println("欢迎, " + h.sayHello("javamxj blog")); } catch (Exception ex) { System.out.println("错误 " + ex); } } 编译代码与运行系统在MS-DOS环境下,创建一个D:\\RMISample目录,把上面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 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。