1、简介

      使用RMI可以实现远程方法的调用,是实现分布式技术的一种方法。RMI的具体应用主要来所可以归纳为三个角色:

  •  服务提供者:实现了服务接口,为其他客户端提供服务;
  •  注册服务器:是一个提供服务注册的实体,服务器提供者需要把他的服务注册到这个才可以被其他客户查找使用;
  •  客户端      :服务的使用者,从注册服务器查找到服务,再使用服务。

        关系如下图所示

 

      其实感觉和web Service的SOAP,WSDL,UDDI差不多。

      2、构建RMI应用的步骤基本如下:

      服务器端:

  •  创建远程接口
  •  实现远程接口提供的服务(即方法)
  •  启动注册服务器
  •  创建和注册服务实例

      客户端:

  •  根据注册的服务名查找服务得到实例的引用
  •  调用实例方法

       下面具体看了个例子如何使用RMI构建简单应用吧。我们来做一个加法的服务:

       服务器端:

创建接口IAdd

package myrmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IAdd extends Remote {
    public int add(int a, int b) throws RemoteException;
}

 

实现接口AddImpl

<span style="font-size:16px;">package myrmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class AddImpl extends UnicastRemoteObject implements IAdd {
    /** 
     *  
     
*/
    private static final long serialVersionUID = -7993126226032252610L;

    /*
     * 必須有構造方法,拋出RemoteException异常
     
*/
    public AddImpl() throws RemoteException {
    }

    public int add(int a, int b) throws RemoteException {
        return a + b;
    }
}

启动注册服务,注册服务

<span style="font-size:16px;">package myrmi;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class AddService {
    
    public static void main(String[] args) {
        try {
            // 在本地启动注册服务,或者也可以在其他机器启动作为注册服务器
            LocateRegistry.createRegistry(1099);
            // 在其他机器启动注册服务器可以用:rmiregistry port
            
// 建立一个远程服务对象并注册到注册服务器
            IAdd addobj = new AddImpl();
            // 注册服务对象到注册服务器
            Naming.rebind("//192.168.1.100/AddService", addobj);
            System.out.println("Add Service is started!");
        } catch (Exception e) {
            System.out.println("Service Error!");
        }
    }
}
 客户端 :

package myrmi;
import java.rmi.Remote;
import java.rmi.RemoteException;


public interface IAdd extends Remote {
    public int add(int a, int b) throws RemoteException;
}

package myrmi;
import java.rmi.Naming;

public class AddClient {
    public static void main(String[] argv) {
        try {
            // 创建远程对象引用
            IAdd objref = (IAdd) Naming.lookup("//192.168.1.100/AddService");
            // 调用远程方法
            int sum = 0;
            sum = objref.add(1, 1);
            System.out.println("result is " + sum);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}