注:轉載於http://www.blogjava.net/hubin/archive/2008/04/14/171116.htmlhtml
在開始寫例子以前仍是先,瞭解一下RMI的相關知識.
什麼是RMI
遠程方法調用是一種計算機之間對象互相調用對方函數,啓動對方進程的一種機制,
使用這種機制,某一臺計算機上的對象在調用另一臺計算機上的方法時,使用的程
序語法規則和在本地機上對象間的方法調用的語法規則同樣。java
優勢
這種機制給分佈計算的系統設計、編程都帶來了極大的方便。
只要按照RMI規則設計程序,能夠沒必要再過問在RMI之下的網絡細節了,如:TCP和Socket等等。
任意兩臺計算機之間的通信徹底由RMI負責。調用遠程計算機上的對象就像本地對象同樣方便。
一、面向對象:
RMI可將完整的對象做爲參數和返回值進行傳遞,而不只僅是預約義的數據類型。
也就是說,能夠將相似Java哈西表這樣的複雜類型做爲一個參數進行傳遞。
二、可移動屬性:
RMI可將屬性從客戶機移動到服務器,或者從服務器移動到客戶機。
三、設計方式:
對象傳遞功能使您能夠在分佈式計算中充分利用面向對象技術的強大功能,如二層和三層結構系統。
若是用戶可以傳遞屬性,那麼就能夠在本身的解決方案中使用面向對象的設計方式。
全部面向對象的設計方式無不依靠不一樣的屬性來發揮功能,若是不能傳遞完整的對象——包括實現和類型
——就會失去設計方式上所提供的優勢。
四、安全性:
RMI使用Java內置的安全機制保證下載執行程序時用戶系統的安全。
RMI使用專門爲保護系統免遭惡意小程序侵害而設計的安全管理程序。
五、便於編寫和使用
RMI使得Java遠程服務程序和訪問這些服務程序的Java客戶程序的編寫工做變得輕鬆、簡單。
遠程接口實際上就是Java接口。
爲了實現RMI的功能必須建立遠程對象任何能夠被遠程調用的對象必須實現遠程接口。但遠程
接口自己並不包含任何方法。於是須要建立一個新的接口來擴展遠程接口。
新接口將包含全部能夠遠程調用的方法。遠程對象必須實現這個新接口,因爲新的接口擴展了
遠程接口,實現了新接口,就知足了遠程對象對實現遠程接口的要求,所實現的每一個對象都將
做爲遠程對象引用。
我的總結:
RMI說白了,就是提供了一種遠程的方法調用。 這種調用簡單方便,能夠傳遞複雜java對象。如今流行的j2ee中的EJB的底層實現技術就是RMI,EJB的調用就是通過封裝的,更高級的RMI調用。編程
下面咱們就來寫一個RMI的程序:
前提:小程序
在Eclipse中裝入RMI插件(從附件下載)。下載解壓後將features和 plugins分別拷到eclipse的對應文件夾中,而後重啓Eclipse,最好能在cmd窗口中加上 -clean啓動。安全
一.建立RMI程序的6個步驟:
1.定義一個遠程接口
2.實現這個遠程接口
3.開發服務器
4.開發客戶機
5.生成存根和基幹,啓動RMI註冊表、服務器和客戶機 (可在dos中用rmic生成存根和基幹)
二. 程序詳細說明服務器
先建一個java工項"rmiDemo1"(個人是I:\codeDemo\elispe\rmidemo1\rmiDemo1,在這裏要特別注意的存放目錄)
1.定義一個遠程接口的接口,該接口中的每個方法必須聲明它將產生一個RemoteException異常。網絡
import java.rmi.Remote;
import java.rmi.RemoteException;app
public interface SayHello extends Remote {//須要從Remote繼承
public String sayHello(String info)throws RemoteExceptio //須要拋出remote異常n;eclipse
}分佈式
二、定義一個實現該接口的類。
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class SayHelloImpl extends UnicastRemoteObject implements SayHello {
protected SayHelloImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}
public String sayHello(String info) throws RemoteException {
return "hello="+info;
}
}
實現接口的類必須繼承UnicastRemoteObject類。
擴展java.rmi.server.UnicastRemoteObject
UnicastRemoteObject顧名思義,是讓客戶機與服務器對象實例創建一對一的鏈接。
3.生成程序的根文件
在rmiDemo1上單擊右鍵,選擇RMI--Enable Stubs Generation,自動會在bin/文件夾中生成SayHelloImpl_Stub.class。
4.建立服務器類
import java.rmi.*;
import java.net.*;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2007</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class SayRmiServer {
public SayRmiServer() {
}
public static void main(String args[]) throws RemoteException, MalformedURLException {
SayHelloImpl add = new SayHelloImpl();
Naming.rebind("addnumbers", add);
}
}
5.建立Client類
import java.rmi.*;
import java.net.*;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2007</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class SayRmiClient {
public SayRmiClient() {
}
public static void main(String args[]) throws RemoteException,
MalformedURLException, NotBoundException {
String url = "rmi://127.0.0.1/addnumbers";
SayHello add = (SayHello) Naming.lookup(url);
String result = add.sayHello("hubin");
System.out.println(result);
}
}
三.運行調試項目
在運行以前須要進行一下設置,不然,會提示錯誤信息,說找不到stub類。
一、啓動RMIRegistry
Eclipse菜單window->show view->others,在彈出菜單中選擇RMI Views->RMI Registry Inspector,這是會多出來一個窗口,這裏能夠顯示已經註冊的RMI應用。
點擊工具條上的RMI Plugin圖標,在菜單中選擇Start Local Registry。
在 運行-->cmd--->cd 進入你項目生成class文件所在目錄,如個人是( cd I:\codeDemo\elispe\rmidemo1\rmiDemo1\bin,在當前目錄下,直接運行rmiRegistry命令),若是不在存處注 冊,你的服務會老是聯結不上的.
注意這個只須要啓動一次,除非你把它關掉。
二、配置運行RMI服務
右鍵點擊左邊樹中的RMI_Server.java文件,菜單Debug As ->RMI Application。在彈出對話框中找到RMI Properties標籤頁。
這時這裏前兩項顯示紅色。
選中java.security.police項的value框,點擊選擇按鈕會出現文件選擇對話框,咱們這裏設置成C:\Java \jre1.5.0_05\lib\security\java.security。就是jre的安全策略配置文件,要選擇成泥當前用的jdk的側略文 件。
選中第二項java.rmi.server.codebase的value項,這裏選擇編譯後類包所在的文件夾。點擊選擇按鈕->add按鈕 ->pick from workspace,選擇當前工程RMITest的bin文件夾。這裏是file:/I:\codeDemo\elispe\rmidemo1 \rmiDemo1\bin。
點擊apply按鈕。
點擊debug按鈕。
4.單擊RmiServer選擇Run as--RMI Application 5.單擊RmiClient選擇Run as--Java Application