RMI(Remote method invoke)遠程方法調用
功能
RMI使客戶對象能調用遠程服務器上的方法,就像調用本地方法一樣
原理
客戶對象實際上是通過客戶輔助對象(客戶代理)和服務輔助對象(服務代理)來調用服務器上提供的服務
- 1、客戶對象想要調用服務器上的方法,使用客戶輔助對象(客戶以爲客服輔助對象就是提供服務的對象)
- 2、客戶輔助對象打包調用信息(變量、方法名等),通過網絡將打包信息運輸給服務輔助對象,告訴服務器“客戶想要調用一個方法”
- 3、服務輔助對象接收來自客戶輔助對象(通過socket連接)的信息,並將其解包,根據信息調用服務對象(這纔是真正的服務對象)
- 4、服務對象上的方法被調用,將得到的結果返回給服務輔助對象
- 5、服務輔助對象將返回信息打包,通過網絡傳給客戶輔助對象
- 6、客戶輔助對象解包返回信息,返回給客戶對象
上述過程,對於客戶來說透明的(看上去像沒有,實際存在),即不可見
使用RMI的例子
遠程接口——客戶端通過訪問該對象來調用服務端的方法,服務端需要實現該接口
import java.rmi.*;
/**
* 製作遠程接口
*/
public interface MyRemote extends Remote {
public String sayHello() throws RemoteException;
}
服務實現
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* 製作遠程實現
* 需要繼承UnicastRemoteObject,來完成遠程功能
*/
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {
protected MyRemoteImpl() throws RemoteException {
//由於父類UnicastRemoteObject的構造函數拋出了異常,所以子類申明自己的構造函數並拋出異常
}
@Override
public String sayHello() throws RemoteException {
return "Server say - hello";
}
public static void main(String[] args) {
try {
//產生遠程對象
MyRemote service = new MyRemoteImpl();
//綁定到rmiregistry,客戶講在註冊的rmiregistry中找相應名字的遠程對象
//rmiregistry相當於一個通訊錄
Naming.rebind("RemoteHello", service);
System.out.println("the server is ready");
} catch (Exception e) {
e.printStackTrace();
}
}
}
客戶調用服務的方法
import java.rmi.*;
public class MyRemoteClient {
public static void main(String[] args) {
new MyRemoteClient().go();
}
public void go() {
try {
//在rmiregistry中查找已註冊的服務
MyRemote service = (MyRemote) Naming.lookup("rmi://localhost/RemoteHello");
String s = service.sayHello();
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
結果
在運行的時候需要先啓動rmiregistry,Naming.rebind()註冊服務的時候rmiregistry必須運行
在cmd中進入所在項目的bin目錄下運行start rmiregistry,彈出一個黑框
運行服務代碼:
運行客戶代碼:
細節
1、可在eclipse裏面加載rmi的插件運行。
2、在RMI中客戶輔助對象爲Stub,服務輔助對象爲Skeleton
早期還需要運行rmic產生Stub和Skeleton,但是現在新一點的版本JVM會自動生成,不需要我們再手動運行,但是是存在的。可以通過rmi插件查看其文件
RMI原理圖(時序圖)
http://haolloyin.blog.51cto.com/1177454/332426
demo視頻(安裝和例子)
http://www.genady.net/rmi/v20/demos/
java RMI 在eclipse中的實現
http://blog.csdn.net/sima1989/article/details/41045249