天天看點

Java RMI遠端方法調用

RMI(遠端接口調用)

1. RMI的原理:

RMI系統結構,在用戶端和伺服器端都有幾層結構。

方法調用從客戶對象經占位程式(Stub)、遠端引用層(Remote Reference Layer)和傳輸層(Transport

Layer)向下,傳遞給主機,然後再次經傳 輸層,向上穿過遠端調用層和骨幹網(Skeleton),到達伺服器對象。

占位程式扮演着遠端伺服器對象的代理的角色,使該對象可被客戶激活。

遠端引用層處理語義、管理單一或多重對象的通信,決定調用是應發往一個伺服器還是多個。傳輸層管理實際的連接配接,并且追追蹤可以接受方法調用的遠端對象。服

務器端的骨幹網完成對伺服器對象實際的方法調用,并擷取傳回值。傳回值向下經遠端引用層、伺服器端的傳輸層傳遞回用戶端,再向上經傳輸層和遠端調用層返

回。最後,占位程式獲得傳回值。

2. RMI(遠端方法調用)的組成

一個正常工作的RMI系統由下面幾個部分組成:

  •遠端服務的接口定義

  •遠端服務接口的具體實作

  •樁(Stub)和架構(Skeleton)檔案

  •一個運作遠端服務的伺服器

  •一個RMI命名服務,它允許用戶端去發現這個遠端服務

  •類檔案的提供者(一個HTTP或者FTP伺服器)

  •一個需要這個遠端服務的用戶端程式

3. RMI的實作

3.1 伺服器端的實作

(1)編寫一個遠端接口:

package com.gjy.rmi.service;

import java.rmi.Remote;
import java.rmi.RemoteException;


public interface AddServer extends Remote { 
    public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException; 
}      

(2) 編寫遠端接口的實作

package com.gjy.rmi.service;

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

public class AddServerImpl extends UnicastRemoteObject implements AddServer { 
    public AddServerImpl() throws RemoteException { 
        super(); 
    } 
    public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException { 
        return firstnumber + secondnumber; 
    } 
}      
package com.gjy.rmi.service;

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

public class RmiServer { 
     /**   
        * 啟動 RMI 注冊服務并進行對象注冊   
        */   
       public static void main(String[] argv)    
       {    
          try   
          {    
             //啟動RMI注冊服務,指定端口為1099 (1099為預設端口)    
             //也可以通過指令 $java_home/bin/rmiregistry 1099啟動    
             //這裡用這種方式避免了再打開一個DOS視窗    
             //而且用指令rmiregistry啟動注冊服務還必須事先用RMIC生成一個占位程式(stub類)為它所用    
             LocateRegistry.createRegistry(1099);    
                
             //建立遠端對象的一個或多個執行個體,下面是hello對象    
             //可以用不同名字注冊不同的執行個體    
             AddServer add = new AddServerImpl();    
                
             //把hello注冊到RMI注冊伺服器上,命名為Hello    
             Naming.rebind("Hello", add);    
                 
             //如果要把hello執行個體注冊到另一台啟動了RMI注冊服務的機器上    
             //Naming.rebind("//192.168.1.105:1099/Hello",hello);    
                
             System.out.println("Hello Server is ready.");    
          }    
          catch (Exception e)    
          {    
             System.out.println("Hello Server failed: " + e);    
          }    
       }   
}      
package com.gjy.rmi.client;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import com.gjy.rmi.service.AddServer;

public class RmiClient { 
public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException { 
        String url="rmi://127.0.0.1/Hello"; 
        AddServer add; 
        add = (AddServer)Naming.lookup(url); 
        int result=0;
        for (int i =0;i<10;i++){
        result = add.AddNumbers(10,i);
        System.out.println(result); 
        }
    } 
}      

懷有希望!!