RMI(遠程接口調用)

1. RMI的原理: 
RMI系統結構,在客戶端和服務器端都有幾層結構。 

方法調用從客戶對象經佔位程序(Stub)、遠程引用層(Remote Reference Layer)和傳輸層(Transport Layer)向下,傳遞給主機,而後再次經傳 輸層,向上穿過遠程調用層和骨幹網(Skeleton),到達服務器對象。 佔位程序扮演着遠程服務器對象的代理的角色,使該對象可被客戶激活。 遠程引用層處理語義、管理單一或多重對象的通訊,決定調用是應發往一個服務器仍是多個。傳輸層管理實際的鏈接,而且追追蹤能夠接受方法調用的遠程對象。服務器端的骨幹網完成對服務器對象實際的方法調用,並獲取返回值。返回值向下經遠程引用層、服務器端的傳輸層傳遞迴客戶端,再向上經傳輸層和遠程調用層返回。最後,佔位程序得到返回值。 

2. RMI(遠程方法調用)的組成 
一個正常工做的RMI系統由下面幾個部分組成: 

  •遠程服務的接口定義 
  •遠程服務接口的具體實現 
  •樁(Stub)和框架(Skeleton)文件 
  •一個運行遠程服務的服務器 
  •一個RMI命名服務,它容許客戶端去發現這個遠程服務 
  •類文件的提供者(一個HTTP或者FTP服務器) 
      •一個須要這個遠程服務的客戶端程序 



3. RMI的實現 
(1) 服務器端的實現 
編寫一個遠程接口 java

1 package com.gjy.rmi.service; 2 
3 import java.rmi.Remote; 4 import java.rmi.RemoteException; 5 
6 public interface AddServer extends Remote { 7     public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException; 8 }

 

(2) 編寫遠程接口的實現 服務器

 1 package com.gjy.rmi.service;  2   
 3 import java.rmi.RemoteException;  4 import java.rmi.server.UnicastRemoteObject;  5   
 6 public class AddServerImpl extends UnicastRemoteObject implements AddServer {  7     public AddServerImpl() throws RemoteException {  8         super();  9  } 10     public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException { 11         return firstnumber + secondnumber; 12  } 13 }  

 

(3) 編寫服務器端程序 框架

 1 package com.gjy.rmi.service;  2   
 3 import java.rmi.Naming;  4 import java.rmi.registry.LocateRegistry;  5   
 6 public class RmiServer {  7      /**    
 8  * 啓動 RMI 註冊服務並進行對象註冊  9         */     
10        public static void main(String[] argv) 11  { 12           try     
13  { 14              //啓動RMI註冊服務,指定端口爲1099 (1099爲默認端口) 15              //也能夠經過命令 $java_home/bin/rmiregistry 1099啓動 16              //這裏用這種方式避免了再打開一個DOS窗口 17              //並且用命令rmiregistry啓動註冊服務還必須事先用RMIC生成一個佔位程序(stub類)爲它所用 
18              LocateRegistry.createRegistry(1099); 19                   
20              //建立遠程對象的一個或多個實例,下面是hello對象 21              //能夠用不一樣名字註冊不一樣的實例 
22              AddServer add = new AddServerImpl(); 23                   
24              //把hello註冊到RMI註冊服務器上,命名爲Hello 
25              Naming.rebind("Hello", add); 26              //若是要把hello實例註冊到另外一臺啓動了RMI註冊服務的機器上 27              //Naming.rebind("//192.168.1.105:1099/Hello",hello); 
28                   
29              System.out.println("Hello Server is ready."); 30  } 31           catch (Exception e) 32  { 33              System.out.println("Hello Server failed: " + e); 34  } 35  } 36 }  
View Code

 

(4) 編寫客戶端程序 ide

 1 package com.gjy.rmi.client;  2   
 3 import java.net.MalformedURLException;  4 import java.rmi.Naming;  5 import java.rmi.NotBoundException;  6 import java.rmi.RemoteException;  7   
 8 import com.gjy.rmi.service.AddServer;  9   
10 public class RmiClient { 11 public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException { 12         String url="rmi://127.0.0.1/Hello"; 13  AddServer add; 14         add = (AddServer)Naming.lookup(url); 15         int result=0; 16         for (int i =0;i<10;i++){ 17         result = add.AddNumbers(10,i); 18  System.out.println(result); 19  } 20  } 21 }  
客戶端
相關文章
相關標籤/搜索