RMI,遠程方法調用。java
傳統的Web應用程序,只限於對請求使用HTTP協議,對響應使用HTML編程
使用代理的RMI,代理之間通訊實現技術:架構
CORBA,通用對象請求代理架構,支持任何編程語言編寫的對象之間的方法調用。使用二進制的IIOP協議來實現對象間的對信。IDL定義接口編程語言
Web服務架構WS,統稱爲WS-*,獨立於編程語言,基於xml格式的SOAP協議通訊。WSDL定義接口
分佈式
RMI,Java遠程方法調用技術,支持JAVA分佈式對象之間的方法調用。ide
若是相互通訊的程序都是由java實現,那麼,CORBA與WS*-的通用性和複雜性就不是須要的。RMI是專門針對java之間的通訊。
this
RMI調用過程編碼
RMI使用序列化機制編碼,SOAP協議中對象被編碼爲xmlurl
實現遠程對象和獲取客戶端存根的細節有賴於分佈式對象採用的技術代理
RMI編程模型
1)接口與實現
import java.rmi.Remote; import java.rmi.RemoteException; public interface Warehouse extends Remote { double getPrice(String description) throws RemoteException; }
/** * Unicast產生單一對象ip地址和端口 */ public class WarehouseImpl extends UnicastRemoteObject implements Warehouse { private Map<String, Double> prices; protected WarehouseImpl() throws RemoteException { prices = new HashMap<String, Double>(); prices.put("Blackwell Toaster", 24.95); prices.put("ZapXpress Microwave Oven", 24.95); //若是不extends UnicastRemoteObject //調用靜態方法實例化 // UnicastRemoteObject.exportObject(this, 0); } @Override public double getPrice(String description) throws RemoteException { Double price = prices.get(description); return price == null ? 0 : price; } }
2)RMI註冊表
public class WarehouseServer { public static void main(String[] args) throws RemoteException, NamingException { System.out.println("Constructing server implementiong"); WarehouseImpl warehouse = new WarehouseImpl(); System.out.println("Bingding server implementiong to registry"); Context context = new InitialContext(); context.bind("rmi:warehouse", warehouse); System.out.println("Waiting for invocations from clients"); } }
public class WarehouseClient { public static void main(String[] args) throws NamingException, RemoteException { Context context = new InitialContext(); System.out.println("RMI registry bindings:"); Enumeration<NameClassPair> e = context.list("rmi://localhost/"); while (e.hasMoreElements()) { System.out.println(e.nextElement().getName()); } String url = "rmi://localhost/warehouse"; Warehouse warehouse = (Warehouse) context.lookup(url); String descr = "Blackwell Toaster"; double price = warehouse.getPrice(url); System.out.println(descr + ":" + price); } }
JVM之間傳遞值有兩種機制
1)實現了Remote接口的類的對象做爲遠程引用傳遞;
2)實現了Serializable接口,沒有實現Remote接口的類的對象將使用序列化複製傳遞;
序列化對於大型對象來講比較慢,而已只是傳遞副本,不能改變傳遞參數;能夠選擇傳遞引用,遠程調用方法比本地調用方法開銷大得多。