要編寫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;
}
我們需要實現在前面的步驟中建立的遠端介面。可以單獨寫一個實現類,也可以直接使伺服器程式實現這個介面。
開發一個實現類 -
以下是一個實現類。 在這裡,我們建立了一個名為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
開啟另一個命令列提示符,執行上面命令,如下所示 -
驗證遠端呼叫結果 - 當啟動用戶端後,將在伺服器中看到以下輸出。