Java RMI應用程式


要編寫Java的RMI應用程式,必須遵循以下步驟:

  • 定義遠端介面
  • 開發實現類(遠端物件)
  • 開發伺服器程式
  • 開發用戶端程式
  • 編譯應用程式
  • 執行應用程式

定義遠端介面

遠端介面提供特定遠端物件的所有方法的描述。用戶端可與此遠端介面進行通訊。

建立遠端介面 -

  • 建立一個擴充套件預定義介面的介面,該介面屬於該包。
  • 宣告用戶端在此介面中可以呼叫的所有業務方法。
  • 由於在遠端呼叫期間存在網路問題,因此可能會丟擲一個名稱為RemoteException的異常。

以下是遠端介面的範例。首先定義一個名為Hello的介面,此介面有一個名為printMsg()的方法。

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

// Creating Remote interface for our application 
public interface Hello extends Remote {  
   void printMsg() throws RemoteException;  
}

開發實現類(Remote Object)

我們需要實現在前面的步驟中建立的遠端介面。可以單獨寫一個實現類,也可以直接使伺服器程式實現這個介面。

開發一個實現類 -

  • 實現上一步建立的介面。
  • 提供遠端介面的所有抽象方法的實現。

以下是一個實現類。 在這裡,我們建立了一個名為ImplExample的類,並實現了在上一步中建立的介面Hello,並提供了列印訊息 - printMsg()方法的具體實現。

// Implementing the remote interface 
public class ImplExample implements Hello {  

   // Implementing the interface method 
   public void printMsg() {  
      System.out.println("This is an example RMI program");  
   }  
}

開發伺服器程式

RMI伺服器程式應實現遠端介面或擴充套件實現類。在這裡,我們應該建立一個遠端物件並將其系結到RMIregistry

開發伺服器程式 -

  • 從要呼叫遠端物件的位置建立一個用戶端類。
  • 通過範例化實現類建立一個遠端物件,如下所示。
  • 使用屬於包java.rmi.server中的UnicastRemoteObject類的exportObject()方法匯出遠端物件。
  • 使用屬於java.rmi.registry包中的LocateRegistry類的getRegistry()方法獲取RMI登錄檔。
  • 使用Registry類的bind()方法將建立的遠端物件系結到登錄檔。對於此方法,傳遞表示系結名稱和匯出的物件的字串作為引數。對於此方法,需要傳遞一個表示系結名稱的字串值作為引數。這將返回遠端物件。

以下是RMI伺服器程式的範例,建立一名為:Server.java的檔案儲存以下程式碼 -

import java.rmi.registry.Registry; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.RemoteException; 
import java.rmi.server.UnicastRemoteObject; 

public class Server extends ImplExample { 
   public Server() {} 
   public static void main(String args[]) { 
      try { 
         // Instantiating the implementation class 
         ImplExample obj = new ImplExample(); 

         // Exporting the object of implementation class  
         // (here we are exporting the remote object to the stub) 
         Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);  

         // Binding the remote object (stub) in the registry 
         Registry registry = LocateRegistry.getRegistry(); 

         registry.bind("Hello", stub);  
         System.err.println("Server ready"); 
      } catch (Exception e) { 
         System.err.println("Server exception: " + e.toString()); 
         e.printStackTrace(); 
      } 
   } 
}

開發用戶端程式

在這裡我們編寫一個用戶端程式,獲取遠端物件並使用此物件呼叫所需的方法。

要開發用戶端程式,請參考以下步驟 -

  • 從想要呼叫遠端物件的地方建立一個用戶端類。
  • 使用屬於java.rmi.registry包中的LocateRegistry類的getRegistry()方法獲取RMI登錄檔。
  • 使用屬於java.rmi.registry包中的Registry類的lookup()方法從登錄檔獲取物件。
  • lookup()返回一個型別為remote的物件,將其轉換為Hello型別。
  • 最後使用獲取的遠端物件呼叫所需的方法。

以下是RMI用戶端程式的範例,建立一個名稱為:Client.java 的檔案 -

import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry;  

public class Client {  
   private Client() {}  
   public static void main(String[] args) {  
      try {  
         // Getting the registry 
         Registry registry = LocateRegistry.getRegistry(null); 

         // Looking up the registry for the remote object 
         Hello stub = (Hello) registry.lookup("Hello"); 

         // Calling the remote method using the obtained object 
         stub.printMsg(); 

         // System.out.println("Remote method invoked"); 
      } catch (Exception e) {
         System.err.println("Client exception: " + e.toString()); 
         e.printStackTrace(); 
      } 
   } 
}

編譯應用程式

編譯應用程式 -

  • 編譯遠端介面。
  • 編譯實現類。
  • 編譯伺服器程式。
  • 編譯用戶端程式。

或者 -

開啟儲存所有程式的檔案夾,使用以下命令編譯所有Java檔案,如下所示 -

javac *.java

執行結果如下 -

執行應用程式

第一步 - 使用以下命令啟動rmi登錄檔。

start rmiregistry

這將在單獨的視窗中啟動一個rmi登錄檔,如下所示。

第二步 - 執行伺服器類檔案,如下所示。

java Server

開啟另一個命令列提示符,執行上面命令,如下所示 -

第三步 - 執行用戶端類檔案,如下所示。

java Client

開啟另一個命令列提示符,執行上面命令,如下所示 -

驗證遠端呼叫結果 - 當啟動用戶端後,將在伺服器中看到以下輸出。