Eclipse下RMI通訊實現

         頭幾天有一個小學妹找我幫她寫實驗報告,內容一大堆,主要是利用RMI實現通訊,RMI我之前一直沒有用過,此次也算學習了,就把心得寫出來,網上主要都是如何用RMI寫代碼,可是在eclipse下開發RMI和詳細解釋不是不少,我就把我主要理解的一些東西寫出來把。java

        先展現一下本人用命令行運行的代碼流程和解釋,我也是參考人家的。tomcat

Java RMI 簡介

      遠程方法調用( RMI,Remote Method Invocation)是jdk1.1中引入的分佈式對象軟件包,它的出現大大簡化了分佈異構環境中Java應用之間的通訊。
      要使用RMI,必須構建四個主要的類:遠程對象的本地接口、遠程對象實現、RMI客戶機和RMI服務器。RMI服務器生成遠程對象實現的一個實例,並用一個專有的URL註冊。RMI客戶機在遠程RMI服務器上查×××對象,並將它轉換成本地接口類型,而後像對待一個本地對象同樣使用它。
          下面是一個簡單的RMI實例,RMI客戶機經過RMI服務器提供的方法輸出一個語句。例子雖然很簡單,但掌握了Java RMI調用的基本原理和方法,在實現複雜應用時,咱們須要作的也只是完善遠程對象的實現類而已。
 
 
RMI 實例分析
 
1. 遠程對象的本地接口聲明(RMIOperate.java) 

   · 該類僅僅是一個接口聲明, RMI客戶機能夠直接使用它,RMI服務器必須經過一個遠程對象來實現它,並用某個專有的URL註冊它的一個實例。 
   · 遠程接口擴展 java.rmi.Remote 接口。
   · 除了全部應用程序特定的例外以外,每一個方法還必須在  throws 子句中聲明 java.rmi.RemoteException(或 RemoteException 的父類)。
  
  
  
  
  1. Hello.java  
  2. /* * @author javamxj (CSDN Blog) 建立日期 2004-12-27 */   
  3. import java.rmi.*; // RMI本地接口必須從Remote接口派生   
  4. public interface Hello extends Remote { // 接口中的具體方法聲明,注意必須聲明拋出RemoteException  
  5.  String sayHello(String name) throws RemoteException; }  

 2.遠程對象實現類安全

       這個類應實現RMI客戶機調用的遠程服務對象的本地接口,它必須從UnicastRemoteObject繼承,構造函數應拋出RemoteException異常。 服務器

 

  
  
  
  
  1.  HelloImpl.java  
  2.    
  3. /*  
  4.  * @author javamxj (CSDN Blog) 建立日期 2004-12-27  
  5.  */ 
  6. import java.rmi.*;  
  7. import javax.rmi.PortableRemoteObject;  
  8. public class HelloImpl extends PortableRemoteObject implements Hello {  
  9.     /* 構造函數 */ 
  10.     public HelloImpl() throws RemoteException {  
  11.         super();  
  12.     }  
  13.     /* 實現本地接口中聲明的'sayHello()'方法 */ 
  14.     public String sayHello(String message) throws RemoteException {  
  15.         System.out.println("我在RMI的服務器端,客戶端正在調用'sayHello'方法。 ");  
  16.         System.out.println("Hello  " + message);  
  17.         return message;  
  18.     }  

 3.RMI服務器類

   該類建立遠程對象實現類HelloImpl的一個實例,而後經過一個專有的URL來註冊它。所謂註冊就是經過Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,將HelloImpl實例綁定到指定的URL上。框架

 
  
  
  
  
  1.  HelloServer.java  
  2. /*  
  3.  * @author javamxj (CSDN Blog) 建立日期 2004-12-27  
  4.  */ 
  5. import java.rmi.*;  
  6. public class HelloServer {  
  7.     public static void main(String[] args) {  
  8.         // 在服務器端設置安全機制           
  9.         /*  
  10.            if (System.getSecurityManager() == null) {  
  11.                System.setSecurityManager(new RMISecurityManager());   
  12.            }  
  13.         */           
  14.         try {  
  15.             System.out.println("開始 RMI Server ...");  
  16.             /* 建立遠程對象的實現實例 */ 
  17.             HelloImpl hImpl = new HelloImpl();  
  18.             System.out.println("將實例註冊到專有的URL ");  
  19.             Naming.rebind("HelloService", hImpl);  
  20.               
  21.             System.out.println("等待RMI客戶端調用...");  
  22.             System.out.println("");  
  23.         } catch (Exception e) {  
  24.             System.out.println("錯誤: " + e);  
  25.         }  
  26.     }  

 請注意有關 rebind 方法調用的下列參數:eclipse

  • 第一個參數是 URL 格式的 java.lang.String,表示遠程對象的位置和名字。 
    • 須要將 myhost 的值更改成服務器名或 IP 地址。不然,若是在 URL 中省略,則主機缺省值爲當前主機,並且在 URL 中無需指定協議(例如「HelloServer」)。 
    •  URL 中,能夠選擇提供端口號:例如「//myhost:1234/HelloServer」。端口缺省值爲 1099。除非服務器在缺省 1099 端口上建立註冊服務程序,不然須要指定端口號。 
  • 第二個參數爲從中調用遠程方法的對象實現引用。 
  • RMI 運行時將用對遠程對象 stub 程序的引用代替由 hImpl 參數指定的實際遠程對象引用。遠程實現對象(如 HelloImpl 實例)將始終不離開建立它們的虛擬機。所以,當客戶機在服務器的遠程對象註冊服務程序中執行查找時,將返回包含該實現的 stub 程序的對象。 
4.RMI 客戶機類 

   · RMI客戶使用 java.rmi.Naming.lookup()方法,在指定的遠程主機上查找RMI服務對象,若找到就把它轉換成本地接口RMIOperate類型。它與CORBA不一樣之處在於RMI客戶機必須知道提供RMI服務主機的URL,這個URL能夠經過rmi://host/path或rmi://host:port/path來指定,若是省略端口號,就默認使用1099。 
   · Java.rmi.Naming.lookup()方法可能產生三個異常: Java.rmi.RemoteException、Java.rmi.NotBoundException、java.net. MalformedURLException,三個異常都須要捕獲。

 

  
  
  
  
  1. HelloClient.java  
  2. /*  
  3.  * @author javamxj (CSDN Blog) 建立日期 2004-12-27  
  4.  */ 
  5. import java.rmi.*;  
  6. public class HelloClient {  
  7.     public static void main(String[] args) {  
  8.         //   在服務器端設置安全機制           
  9.         /*  
  10.            if (System.getSecurityManager() == null) {  
  11.                System.setSecurityManager(new RMISecurityManager());   
  12.            }  
  13.         */       
  14.         /* 默認爲本地主機和默認端口 */ 
  15.         String host = "localhost:1099";  
  16.         /* 帶輸入參數時,將host設置爲指定主機 */ 
  17.         if (args.length > 0)  
  18.             host = args[0];  
  19.         try {  
  20.             /* 根據指定的URL定位遠程實現對象 */ 
  21.             /* 「h」是一個標識符,咱們將用它指向實現「Hello」接口的遠程對象 */ 
  22.             Hello h = (Hello) Naming.lookup("rmi://" + host + "/HelloService");  
  23.               
  24.             System.out.println("實現「Hello」接口的遠程對象: " + h);  
  25.             System.out.println("我在客戶端,開始調用RMI服務器端的'sayHello'方法");  
  26.             System.out.println("歡迎,  " + h.sayHello("javamxj blog"));  
  27.         } catch (Exception ex) {  
  28.             System.out.println("錯誤 " + ex);  
  29.         }  
  30.     }  
  31. }  

 

5.  編譯代碼與運行系統:
 
   在 MS-DOS環境下,建立一個D:\RMISample目錄,把上面4個文件複製到這個目錄下,而後在此目錄下新建兩個文件夾:client和server(把它們分別看做是客戶端與服務端)。
 
(1).編譯全部的源代碼
    D:\RMISample> javac *.java

(2).生成客戶端存根和服務器框架
    D:\RMISample> rmic HelloImpl
    這將生成 HelloImpl_Stub.class和HelloImpl_Skel.class。
   (  :若是須要查看這兩個類的源代碼,可使用 「 rmic -keep HelloImpl」語句)
 
(3).把 Hello.class、HelloClient.class、HelloImpl_Stub.class複製到client目錄;
    把 Hello.class、HelloServer.class、HelloImpl_Skel.class、HelloImpl_Stub.class 複製到server目錄。
 
(4).啓動 RMI註冊
    D:\RMISample\server>rmiregistry
   (注:我是在命令控制檯下運行這個系統的,必須開啓三個控制檯窗口,一個運行 RMIRegistry,一個運行服務器,還有一個運行客戶端。)
 
(5).運行和調用

● 在服務器上執行 HelloServer
  D:\RMISample\server>java HelloServer
 
● 在本地客戶機上運行 HelloClient
  D:\RMISample\client>java HelloClient
● 在遠程客戶機上運行 HelloClient(須指明RMI服務器主機名或IP地址)
   java HelloClient  222.222.34.34
 
運行 rmiregistry和server後的結果:

 再運行 Client後的結果:

   還有一點要注意,在上面的例子中我註釋了安全管理的代碼,若是把註釋去掉,那麼須要創建一個安全策略文件,好比其文件名爲  policy.txt,內容以下:
grant {
permission java.security.AllPermission "", "";
};
這是一條簡單的安全策略 ,它容許任何人作任何事,對於你的更加關鍵性的應用,你必須指定更加詳細安全策略。把這個文件複製到Client和Server目錄,而後以下運行:
D:\RMISample\server>java -Djava.security.policy=policy.txt HelloServer
D:\RMISample\client>java -Djava.security.policy=policy.txt HelloClient
 
以上是別人在網上總結的過程,可是不是在eclipse下運行,一下是我本身在eclipse運行過程。
1、安裝插件包     Eclipse RMI插件下載地址是http://www.genady.net/rmi/v16/ 
將解壓後獲得的features和plugins文件夾拷貝至Eclipse安裝根目錄下,覆蓋原有文件夾。 我本身已下載到插件包,在附件裏面     啓動Eclipse(若是已經啓動,請從新啓動Eclipse),這時在工具欄上會發現多了一個工具圖標,裏面有Registry的管理選項,這個就是RMI Registry的管理器。說明已經安裝成功了。

2、設置開發環境        socket

         在安裝好插件包後,咱們來設置RMI開發環境。啓動Eclipse,在菜單window->preferences對話框中,選中左邊樹菜單java->rmi,右邊窗口會出現RMI Plugin的默認設置信息。       最上面的Path to RMI registry設置java的RMI Registry的路徑,如這裏設置的是C:/Program Files/Java/jdk1.5.0_05/bin/rmiregistry.exe,通常不用管它。下面的一個框是RMI的服務端口,默認是 1099,這個相似tomcat的服務端口8080同樣,連接的時候須要找到對應的端口才能連接上。其實RMI的最低層是socket。  這裏須要特別指出的是RMI Plugin是個收費的Eclipse插件,有15天的免費試用期。而RMI屬性中最大的窗口就是填使用受權信息的。分佈式

這也就是開發環境的基本設置,主要是須要RMI的插件和設置。ide

3、運行調試項目函數

       在運行以前須要進行一下設置,不然,會提示錯誤信息,說找不到stub類。

        1、啓動RMIRegistry

        Eclipse菜單window->show view->others,在彈出菜單中選擇RMI Views>RMI Registry Inspector,這是會多出來一個窗口,這裏能夠顯示已經註冊的RMI應用。點擊工具條上的RMI Plugin圖標,在菜單中選擇Start Local Registry。注意這個只須要啓動一次,除非你把它關掉。

      2、配置運行RMI服務  右鍵點擊左邊樹中的RMI_Server.java文件,菜單Debug As ->RMI Application。在彈出對話框中找到RMI Properties標籤頁。   這時這裏前兩項顯示紅色。   選中java.security.police項的value框,點擊選擇按鈕會出現文件選擇對話框,咱們這裏設置成C:/Program Files/Java/jre1.5.0_05/lib/security/java.security。就是jre的安全策略配置文件,要選擇成泥當前用的jdk的側略文件。選中第二項java.rmi.server.codebase的value項,這裏選擇編譯後類包所在的文件夾。點擊選擇按鈕->add按鈕->pick from workspace,選擇當前工程RMITest的bin文件夾。這裏是file:/E:/workspace/RMITest/bin/。(這裏有點要補充一下,還能夠 點擊選擇按鈕->add按鈕->compute from classpath)。

以上是運行RMI Application,可是個人電腦沒顯示RMI Application,當時這個窗口也顯示不到任何RMI項目

這時沒法啓動RMIRegistry ,所以只能手動啓動RMIRegistry 

這裏啓動完成RMI註冊,而且會在工程的bin路徑下生成先關的stub類。在運行服務器類和客戶端類就完成了。注意這個RMI註冊只只能啓動一次,除非你把它關掉。

相關文章
相關標籤/搜索