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 }
(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 }