在RMI中,客户端的辅助设施称为stub,而服务器端的辅助设施称为skeleton。

  如何创建远程服务

  1、创建Remote接口

  远程的接口定义了客户端可以远程调用的方法,它是个作为服务的多态化类。stub和服务都会实现此接口

  2、实现Remote接口

  这个是真正执行的类,它实现出定义在该接口上的方法,它是客户端会调用的对象

  3、用rmic产生stub和skeleton

  客户端和服务器都有helper,我们无需创建这些类或产生这些类的源代码,这都会在执行JDK所附的rmic工具时自动地处理掉

  4、启动RMI registry (rmiregistry)

  rmiregistry像电话薄,用户会从此处取得代理(客户端的stub/helper对象)

  5、启动远程服务

  必须让服务对象开始执行,实现服务的类会起始服务的实例并向RMI Registry注册,要有注册后才能对用户服务。

  服务端代码

  定义接口


import java.rmi.Remote; 
import java.rmi.RemoteException; 
 
/** 
 *  
 *    MyRemote.java 
 * 
 *     功   能: TODO  
 *     类   名: MyRemote.java 
 * 
 *  ver     ?更日       角色    担当者     ?更内容 
 *     ────────────────────────────────────────────── 
 *  V1.00   2013-3-19   模块    苏若年     初版 
 * 
 *     Copyright (c) 2013 dennisit corporation All Rights Reserved. 
 *    
 *  Email:<a href="mailto:DennisIT@163.com">发送邮件</a> 
 *   
 *   
 *     Remote是个标记性的接口,意味着没有方法,然而它对RMI有特殊的意义,所以必须遵守这项规则, 
 *     注意这里用的是extends,接口是可以继承其他接口的 
 *  
 */
public interface MyRemote extends Remote{ 
     
    /** 
     * 远程的接口定义了客户端可以远程调用的方法,它是作为服务的多态化类,也是说,客户端会 
     * 调动有实现此接口的stub,而此stub因为会执行网络和输入/输出工作,所以可能会发生各种 
     * 问题,客户端鼻息处理或声明异常来认知这一类风险,如果该方法在接口中声明异常,调用该方 
     * 法的所有程序都必须处理或再声明此异常. 
     *  
     * 远程方法的参数和返回值必须是primitive或serializable的.任何远程方法的参数都会被 
     * 打包通过网络传送,而这时通过序列化完成的,返回值也是一样.所以,如果使用的是自定义类型 
     * 时,必须对其序列化 
     * @return 
     * @throws RemoteException     
     *                         所有接口中的方法都必须声明RemoteException 
     */
    public String sayHello() throws RemoteException;     
     
}