Eclipse下開發RMI

注:轉載於http://www.blogjava.net/hubin/archive/2008/04/14/171116.html

在開始寫例子之前還是先,瞭解一下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的程序:
前提:

在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;

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命令),如果不在存處注 冊,你的服務會總是聯結不上的.


注意這個只需要啓動一次,除非你把它關掉。
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章