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
打開另一個命令行提示符,執行上面命令,如下所示 -
驗證遠程調用結果 - 當啓動客戶端後,將在服務器中看到以下輸出。