本章使用经典的HelloWorld程序来作为RMI开发的第一篇,对于理论知识,笔者在这里也不做过多的阐述,主要目的通过HelloWorld这个经典的程序来说明在windows下的RMI开发的一些基本步骤.笔者也是刚接触RMI,有什么差强人意的地方请各位大虾们口下留情。
RMI技术 1.0:HelloWorld(jdk1.5以前版本) — 创建远程接口:
Hello - package org.tony.rmi.demo ;
- import java.rmi.Remote;
- import java.rmi.RemoteException;
- public interface Hello extends Remote
- {
- String sayHello() throws RemoteException ;
- }
— 创建服务器类:HelloImpl - package org.tony.rmi.demo;
- import java.rmi.Naming ;
- import java.rmi.RemoteException;
- import java.rmi.RMISecurityManager ;
- import java.rmi.server.RemoteServer ;
- import java.rmi.server.UnicastRemoteObject ;
- import org.tony.rmi.demo.Hello ;
- public class HelloImpl implements Hello{
- public HelloImpl() throws RemoteException{
- UnicastRemoteObject.exportObject(this,1234) ;
- }
- public String sayHello(){
- return "Hello ,Rmi world!" ;
- }
- public static void main(String[] args) {
- System.setProperty("java.security.policy","HelloWorld.policy"); if(System.getSecurityManager() == null) {
- System.setSecurityManager(new RMISecurityManager());
- }
- try
- {
- Hello hello = new HelloImpl() ;
- Naming.rebind("HelloWorld",hello);
- System.out.println("注册成功...") ;
- }
- catch (Exception e){
- e.printStackTrace();
- }
- }
- }
— 创建客户端类:HelloClient - package org.tony.rmi.demo ;
- import java.rmi.Naming ;
- import java.rmi.RMISecurityManager ;
- public class HelloClient {
- private static final String HOST_NAME = "localhost" ;
- public static void main(String[] args) {
- System.setProperty("java.security.policy","HelloWorld.policy");
- if(System.getSecurityManager() == null) {
- System.setSecurityManager(new RMISecurityManager()) ;
- }
- try {
- Hello hello = (Hello)Naming.lookup("//" + HOST_NAME + "/HelloWorld");
- String result = hello.sayHello() ;
- System.out.println(result);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
—创建安全策略文件:
HelloWorld.policy
- grant{
- permission java.net.SocketPermission "*:1024-65535", "accept, connect, listen, resolve";
- };
到此为止,此HelloWorld项目所需的文件全部编写完成。接下来就是谈怎样运行这个HelloWorld程序了,当然在JDK1.5以后的RMI编程中,要想启动RMI注册表程序是件很容易的事情,但是在以前的版本还是有点麻烦,本例中未使用IDE开发,所有操作均基于命令提示符下完成的。假定所有文件Hello.java、HelloImpl.java、HelloClient.java在D:Data 目录下:(classpath=D:Data)1.编译所有源程序: javac -d . *.java,生成相应的二进制码文件2. 要想让客户能够远程访问远程接口中的方法,那么我们应该创建一个代理对象供远程客户使用,也就是存根,我们的stub文 件。调用命令 rmic: rmic org.tony.rmi.demo.HelloImpl 当然这样做生成的存根源代码是被删除了的,如果你 想保存源代码,那么你可以使用-keepgrneratedflag 让rmic保存源代码3. 启动RMI注册表程序,新开一个命令提示符窗口,切换到安全策越文件所在目录下本例中的D:Data: 键入命令:rmiregistry –J-Djava.security.policy=HelloWorld.policy 敲击回车后你不会看到任何的结果显示,除了命令提 示符窗口变成了以rmiregistry –J-Djava.security.policy=HelloWorld.policy结尾外。4. 启动构建和注册HelloImpl对象的服务器程序HelloImpl。新开一个命令提示符窗口 切换到工作目录下,键入以下命令启动服务器程序:java –Djava.rmi.server.codebase=file:/D:Data org.tony.rmi.demo.HelloImpl , 如果操作中未出现其他的错误,那么你会看到在控制台打印了一行字符:”注册成 功”,证明服务器启动成功。那么接下来就是通过客户端去调用了5. 当前面的步骤我们都顺利的完成以后,那么我们就要启动客户端访问远程对象了。 新开一个命令提示符窗口并切换到工作目录下:执行HelloClient程序,你会看到控制台打印了一行字符:Hello,RMI world。证明我们的第一个HelloWorld程序成功完成了