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("http://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("http://192.168.1.100/AddService");
            // 調用遠程方法
            int sum = 0;
            sum = objref.add(1, 1);
            System.out.println("result is " + sum);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}