1. 构造一个远程接口Hello:

  package hello;
  public interface Hello extends java.rmi.Remote {
  //rmi应用程序必须继承自java.rmi.Remote
    String sayHello() throws java.rmi.RemoteException ;
    //定义可以远程调用的接口
  }

 2. 完成server方程序,定义HelloImpl类实现Hello接口:

  package hello;
  import java.rmi.*;
  import java.rmi.server.UnicastRemoteObject;
  public class HelloImpl extends UnicastRemoteObject implements Hello
                     //实现Hello接口
  {
    private String name;
    public HelloImpl (String s ) throws java.rmi.RemoteException{
    super(); //调用父类的构造函数
    name = s;
  }
  public String sayHello() throws RemoteException {
    return "Hello world!"; //实现Hello接口定义的方法
  }
  public static void main ( String args [])
  {
    System.setSecurityManager ( new RMISecurityManager() );
    //设置RMI程序需要的安全策略
    try
    {
     HelloImpl obj = new HelloImpl("HelloServer");
     //生成一个HelloImpl的实例
     Naming.rebind("HelloServer", obj);
     //将这个实例绑定到一个名字上
     System.out.println("HelloImpl created and bound in the registry to the name HelloServer");
    } catch (Exception e)
    {
     System.out.println("HelloImpl.main: an exception occured:");
     e.printStackTrace(); //产生异常的话,打印出出错信息
    }
  }
}

  server方生成一个远程对象并和一个可和客户对话的名称"HelloServer"绑定。Client端可以根据该名称寻找相应的远程对象,进而调用其远程方法。

 3. 完成client方程序

  package hello;
  import java.rmi.*; public class HelloClient
  {
   public static void main(String args[])
  {
   System.setSecurityManager(new RMISecurityManager() );
   //设置RMI需要的安全策略
   try
   {
    Hello obj = (Hello) Naming.lookup("HelloServer");
    //从服务端获得一个Hello的远程对象
    String message = obj.sayHello();
    //远程调用Hello的方法
    System.out.println(message);
    //将输出结果打印
   } catch (Exception e)
   {
    System.out.println("Hello client : an exception occured");
    e.printStackTrace(); //若有异常,输出异常信息
   }
  }
}

  client利用java.rmi包中的Naming类的lookup()方法获得远程对象obj,然后调用其远程方法sayHello()获得字符串"Hello World",并输出到屏幕上。

  要运行这几个程序,还有一些工作要做,这几个程序的文件名为Hello.java、HelloImpl.java、HelloClient.java,它们都被放置在的的d:\hello目录下,在windows下,你需要在命令窗口中如此运行它们:

  1. Set CLASSPATH = %CLASSPATH%;d:\

  2. 在d:\hello下编译源代码:
    javac -d .. *.java

  3. 在生成端头和框架模块,首先把目录切换回d:\
    rmic -d . hello.HelloImpl

  4. 在d:\下运行RMI远程对象注册程序
    start rmiregistry

  5. 在d:\下运行服务器程序
    java -Djava.security.policy=my.policy hello.HelloImpl

  6. 在d:\下运行客户端程序
    java -Djava.security.policy=my.policy hello.HelloClient

  其中上面的步骤中5和6出现的my.policy是一个文件,这个文件和Java的安全机制有关,在这个程序中我们不需要安全限制,所以我们把权限设为都可以访问。my.policy如下:
  grant {
      permission java.security.AllPermission;
  };

  你一定要记得设置这个文件,否则RMI将出"拒绝访问"的错误。如果你想了解Java其他的安全机制,那么可以参考Java里有关security的资料。

  RMI属于Java高级技术的一种,通过本小节的学习,你应该已经对RMI有了一定的了解,分布式计算是一个很重要的技术,而Java在分布式计算方面有着很好的前景,以RMI为基础,Java将在分布式计算方面大有作为。