Eclipse Java RMI 入門
關鍵字: rmi
最近在網上看了一些關於RMI的相關內容,可是在寫一個例子的時候總是不成功.經過一段時間的改進.總算是成功運行.在這在裡,把我的例子大家分想一下.
在開始寫例子之前還是先,瞭解一下RMI的相關知識.
什麼是RMI
遠程方法調用是一種電腦之間對象互相調用對方函數,啟動對方進程的一種機制,
使用這種機制,某一台電腦上的對象在調用另外一台電腦上的方法時,使用的程
序文法規則和在本地機上對象間的方法調用的文法規則一樣。
優點
這種機制給分布計算的系統設計、編程都帶來了極大的方便。
只要按照RMI規則設計程式,可以不必再過問在RMI之下的網路細節了,如:TCP和Socket等等。
任意兩台電腦之間的通訊完全由RMI負責。調用遠端電腦上的對象就像本機物件一樣方便。
1、物件導向:
RMI可將完整的對象作為參數和傳回值進行傳遞,而不僅僅是預定義的資料類型。
也就是說,可以將類似Java哈西表這樣的複雜類型作為一個參數進行傳遞。
2、可移動屬性:
RMI可將屬性從客戶機移動到伺服器,或者從伺服器移動到客戶機。
3、設計方式:
對象傳遞功能使您可以在分散式運算中充分利用物件導向技術的強大功能,如二層和三層結構系統。
如果使用者能夠傳遞屬性,那麼就可以在自己的解決方案中使用物件導向的設計方式。
所有物件導向的設計方式無不依靠不同的屬性來發揮功能,如果不能傳遞完整的對象——包括實現和類型
——就會失去設計方式上所提供的優點。
4、安全性:
RMI使用Java內建的安全機制保證下載執行程式時使用者系統的安全。
RMI使用專門為保護系統免遭惡意小程式侵害而設計的安全管理程式。
5、便於編寫和使用
RMI使得Java遠程服務程式和訪問這些服務程式的Java客戶程式的編寫工作變得輕鬆、簡單。
遠程介面實際上就是Java介面。
為了實現RMI的功能必須建立遠程對象任何可以被遠程調用的對象必須實現遠程介面。但遠程
介面本身並不包含任何方法。因而需要建立一個新的介面來擴充遠程介面。
新介面將包含所有可以遠程調用的方法。遠程對象必須實現這個新介面,由於新的介面擴充了
遠程介面,實現了新介面,就滿足了遠程對象對實現遠程介面的要求,所實現的每個對象都將
作為遠程對象引用。
個人總結:
RMI說白了,就是提供了一種遠端方法調用。 這種調用簡單方便,可以傳遞複雜java對象。現在流行的j2ee中的EJB的底層實現技術就是RMI,EJB的調用就是經過封裝的,更進階的RMI調用。
下面我們就來寫一個RMI的程式:
一.建立RMI程式的6個步驟:
1.定義一個遠程介面
2.實現這個遠程介面
3.程式開發伺服器
4.開發客戶機
5.產生存根和基幹,啟動RMI註冊表、伺服器和客戶機 (可在dos中用rmic產生存根和基幹)
二. 程式詳細說明
Eclipse RMI外掛程式是http://www.genady.net/rmi/v16/
這裡下載的是v1.6.5 適用於Eclipse 3.1.x
下載解壓後將features和 plugins分別拷到eclipse的對應檔案夾中
先建一個java工項"rmiDemo1"(我的是I:/codeDemo/elispe/rmidemo1/rmiDemo1,在這裡要特別注意的存放目錄)
1.定義一個遠程介面的介面,該介面中的每一個方法必須聲明它將產生一個RemoteException異常。
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface SayHello extends Remote {//需要從Remote繼承
public String sayHello(String info)throws RemoteExceptio //需要拋出remote異常n;
}
2、定義一個實現該介面的類。
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類。
1、啟動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命令),如果不在存處注
冊,你的服務會總是連接不上的.目前我還沒有找到好的方法來設定,如哪位有好的方法可以告訴我.郵箱:live525@126.com
注意這個只需要啟動一次,除非你把它關掉。
2、配置運行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