JAVA RMI是什么?
Java RMI 指的是遠程方法調用 (Remote Method Invocation)。它是一種機制,能夠讓在某個 Java 虛擬機上的對象調用另一個 Java 虛擬機中的對象上的方法??梢杂么朔椒ㄕ{用的任何對象必須實現該遠程接口。
RMI是java的遠端調用機制(RPC)的實現。即RMI是一組JAVA語言實現RPC的API。
通俗解釋
在這個JVM中通過RMI可以調用其他JVM中對象的方法。不管是這臺計算機上JVM還是其他其他計算機上的JVM。
RMI的底層是使用了TCP/IP協議進行通信的。基于JAVA中的BIO實現的。
客戶端調用過程中的底層原理細節:
- 客戶端通過socket發送rmi請求"rmi://127.0.0.1:1099/action"
- 客戶端拿到返回的一串二進制碼,這個是服務端對象的序列化。
- 客戶端將二進制碼反序列為對象。
- 客戶端本地調用對象的方法。
- 客戶端RMI底層進行通信將改變的對象更新到服務端。
服務端RMI使用方式:
- 設計遠程調用的接口(如IRmiAction),該接口必須在服務端和客戶端都要有。
- 定義可實例化的對象的類(如RmiActionImpl),可以直接繼承UnicastRemoteObject(實現了對象序列化)
- 實現遠程方法接口。
- 注冊RMI端口(必需)
LocateRegistry.createRegistry(1099); - 等待接收rmi請求
Naming.rebind("rmi://127.0.0.1:1099/hello", action);
客戶端RMIAPI使用方法:
- 發送請求,獲得對象
IRmiAction action=(IRmiAction) Naming.lookup("rmi://127.0.0.1:1099/hello"); - 調用方法
action.add();
demo 代碼
RMI遠程調用方法接口
public interface IRmiAction extends Remote{
public int add() throws RemoteException;
}
對象實例以及服務端
public class RmiActionImpl extends UnicastRemoteObject implements IRmiAction{
private static final long serialVersionUID = -2241003422571775103L;
private int total=0;
protected RmiActionImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
@Override
public int add() throws RemoteException {
// TODO Auto-generated method stub
total++;
return total;
}
public int getTotal(){
return total;
}
public static void main(String[] args) {
try {
LocateRegistry.createRegistry(1099);
IRmiAction action=new RmiActionImpl();
Naming.rebind("rmi://127.0.0.1:1099/hello", action);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客戶端調用
public class RmiActionClient {
public static void main(String[] args) {
try {
IRmiAction action=(IRmiAction) Naming.lookup("rmi://127.0.0.1:1099/hello");
System.out.println(action.add());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NotBoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}