标题：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