RMI 指的是遠端方法呼叫 (Remote Method Invocation)。 它是一種機制,能夠讓在某個 Java虛擬機器上的物件呼叫另一個 Java 虛擬機器中的物件上的方法。可以用此方法呼叫的任何物件必須實作該遠端介面。
當呼叫這樣一個物件時,其參數為"marshalled" 並將其從本機虛擬機器傳送至遠端虛擬機器(該遠端虛擬機的參數為"unmarshalled" )上。此方法終止時,將編組來自遠端機的結果並將結果傳送至呼叫方的虛擬機器。如果方法呼叫導致拋出異常,則該異常將指示給呼叫方。
提供遠端存取的時候,我們首先需要定義遠端能夠存取哪些東西,在Java中,定義這類介面需要實作Remote介面
public interface Business extends Remote{ public String echo(String msg) throws RemoteException; }
定義完介面之後,這些功能是需要我們自己在Server端實現的,因此,聲明一個類別實作我們提供介面。
public class BusinessImpl implements Business{ @Override public String echo(String msg) throws RemoteException { if("quit".equalsIgnoreCase(msg)) { System.out.println("Server will be shutdown"); System.exit(0); } System.out.println("Message from client:"+msg); return "Server response:"+msg; } }
實現完這個方法之後,有一個問題是,怎麼運行,既然是遠端訪問,肯定得有端口號,肯定得有實例,所以我們還需要註冊我們的代碼
public class Server { public static final String SERVER_REGISTER_NAME = "BusineeDemo"; public static void main(String[] args) throws RemoteException { int port = 2016; Business business = new BusinessImpl(); UnicastRemoteObject.exportObject(business,port); Registry registry = LocateRegistry.createRegistry(1099); registry.rebind(SERVER_REGISTER_NAME, business); } }
這裡有兩個Java的類別:UnicastRemoteObject和LocateRegistry
一個介面:Registry
Registry介面:對簡單的遠端物件提供一個遠端接口用於提供儲存和獲取遠端物件的引用,而這些是透過任意的String類型的變數名稱獲取,bind,unbind,rebind方法是用於更改註冊的這些名稱,lookup和list方法是用於查詢當前當前已經綁定的物件。
UnicastRemoteObject類別:用於導出一個遠端物件
LocateRegistry類別:是一個用來獲得遠端呼叫物件參考的輔助類別程序,主要是在一個特定的IP上建立一個遠端物件來接受來自特定連接埠的回呼。
簡單的服務端完成了,現在來看客戶端:
客戶端程式碼就更簡單,前面我們提到我們可以透過Registry的lookup方法來取得目前已經綁定的服務,所以很自然,我們首先要獲得這個Registry
public class Client { public static void main(String[] args) throws RemoteException, NotBoundException { // Registry registry = LocateRegistry.getRegistry("localhost"); Registry registry = LocateRegistry.getRegistry("localhost", 1099); Business business = (Business) registry.lookup(Server.SERVER_REGISTER_NAME); System.out.println(business.echo("Hello Server")); } }
以上是怎麼用java寫一個rmi的詳細內容。更多資訊請關注PHP中文網其他相關文章!