JAVA RMI原理
RMI全稱Remote Method Invocation,即遠端呼叫介面,採用CS+代理的架構。CS體現在通訊兩端的其中一端作為server提供服務,另一端作為client請求服務,通過socket實現網路通訊。代理體現在任一端都分為兩層結構,上層處理具體業務,下層實現端到端通訊代理。通訊架構圖如下:
圖-1 RMI通訊架構
在編寫基於RMI架構的程式碼時,需要注意的兩點:
(1)RMI要求物件必須實現Remote標記介面,且所有介面都必須丟擲RemoteException異常。
(2)物件的類如果繼承自UnicastRemoteObject類,必須定義顯示的建構函式,並丟擲
RemoteException異常,因為UnicastRemoteObject類的建構函式丟擲了RemoteException異
常。
(3)因為物件需要在網路上傳輸,物件的類還必須實現Serializable介面。
構建步驟:
(1)編寫業務介面;
(2)實現業務介面;
(3)建立服務登錄檔,並繫結業務物件
(4)客戶端請求服務物件,並呼叫物件方法。
示例程式碼如下:
// 業務介面:
ServerService.java:
package com.myRMI;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServerService extends Remote {
public String SoS(String name, String location) throws RemoteException;
}
// 介面實現:
ServerServiceImpl.java:
package com.myRMI;
import java.rmi.server.*;
import java.rmi.RemoteException;
public class ServerServiceImpl extends UnicastRemoteObject implements ServerService {
public ServerServiceImpl() throws RemoteException {
super();
}
public String SoS(String name, String location) throws RemoteException {
return name + "! Police is going to " + location + " to help you out!";
}
}
// 服務端業務註冊和繫結
Server.java:
package com.myRMI;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class Server {
public static void main(String[] args) throws Exception {
ServerServiceImpl ssi = new ServerServiceImpl();
// create registy & mapping service
LocateRegistry.createRegistry(5899);
Naming.bind("rmi://localhost:5899/ServerService", ssi);
System.out.println("Server started!");
}
}
// 客戶端業務查詢和執行
Client.java:
package com.myRMI;
import java.rmi.Naming;
public class Client {
public static void main(String[] args) throws Exception {
ServerService ss = (ServerService)Naming.lookup("rmi://localhost:5899/ServerService");
System.out.println(ss.SoS("Jack", "North Korea"));
}
}
RMI通訊架構基本原理就是這些,有個缺點:
RMI使用JAVA的Serialization機制實現,其客戶端和伺服器端都只能是Java程式,不能跨語言;
至於服務地址的繫結可以通過DNS來解決。
轉載於:https://my.oschina.net/yepanl/blog/1585021