RMI軟件包的描述
RMI 指的是遠程方法調用 (Remote Method Invocation)。它是一種機制,能夠讓在某個 Java虛擬機上的對象調用另一個 Java 虛擬機中的對象上的方法。可以用此方法調用的任何對象必須實現該遠程接口。調用這樣一個對象時,其參數爲 "marshalled" 並將其從本地虛擬機發送到遠程虛擬機(該遠程虛擬機的參數爲 "unmarshalled")上。該方法終止時,將編組來自遠程機的結果並將結果發送到調用方的虛擬機。如果方法調用導致拋出異常,則該異常將指示給調用方。
RMI簡單實現
定義遠程訪問接口
首先由客戶端提供需要遠程訪問的接口,由服務端來實現,接口代碼如下:
import java.rmi.Remote; public interface IRMIface extends Remote {//繼承遠程對象Remote //由於繼承了Remote,所以方法中要拋出RemoteException異常 public long add(long a,long b) throws java.rmi.RemoteException; }
服務端實現接口
接口實現代碼如下:
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class RMIfaceImpl extends UnicastRemoteObject implements IRMIface { private static final long serialVersionUID = 1L; protected RMIfaceImpl() throws RemoteException{ //這個構造方法不能少 //網上有人說是因爲繼承了UnicastRemoteObject用來拋出異常用的 //具體還未深入研究 } @Override public long add(long a, long b) throws RemoteException { return a+b; } }
服務端註冊接口
註冊接口代碼:import java.rmi.Naming; import java.rmi.registry.LocateRegistry; public class RemoteBinding { public static void main(String[] args) { try{ IRMIface myRemote = new RMIfaceImpl(); System.out.println("=========start binding==========="); LocateRegistry.createRegistry(8088);//註冊端口 Naming.rebind("rmi://localhost:8088/remoteRMI", myRemote);//綁定 System.out.println("=========OK==========="); }catch(Exception e){ e.printStackTrace(); } } }
編寫客戶端代碼
import java.rmi.Naming; public class MyRequest { public static void main(String [] args){ try{ System.out.println("=========RMI remoteRMI==========="); IRMIface myRemote = (IRMIface) Naming.lookup("rmi://localhost:8088/remoteRMI"); System.out.println("=========RMI OK remoteRMI==========="); long test = myRemote.add(10L, 20L); System.out.println(test); }catch(Exception e){ e.printStackTrace(); } } }
測試運行
CMD打開命令窗口進入到java文件所在的文件夾,編譯好所有的類(以下操作均在class文件的文件夾下)
第一步、用rmiregistry命令啓動服務
第二步、新開一個窗口輸入命令 java RemoteBinding 運行服務端綁定接口
第三步、再新開一個窗口輸入命令 java MyRequest 運行客戶端調用
注意:以上順序不能換