頭幾天有一個小學妹找我幫她寫實驗報告,內容一大堆,主要是利用RMI實現通訊,RMI我之前一直沒有用過,此次也算學習了,就把心得寫出來,網上主要都是如何用RMI寫代碼,可是在eclipse下開發RMI和詳細解釋不是不少,我就把我主要理解的一些東西寫出來把。java
先展現一下本人用命令行運行的代碼流程和解釋,我也是參考人家的。tomcat
- Hello.java
- /* * @author javamxj (CSDN Blog) 建立日期 2004-12-27 */
- import java.rmi.*; // RMI本地接口必須從Remote接口派生
- public interface Hello extends Remote { // 接口中的具體方法聲明,注意必須聲明拋出RemoteException
- String sayHello(String name) throws RemoteException; }
2.遠程對象實現類安全
這個類應實現RMI客戶機調用的遠程服務對象的本地接口,它必須從UnicastRemoteObject繼承,構造函數應拋出RemoteException異常。 服務器
- HelloImpl.java
- /*
- * @author javamxj (CSDN Blog) 建立日期 2004-12-27
- */
- import java.rmi.*;
- import javax.rmi.PortableRemoteObject;
- public class HelloImpl extends PortableRemoteObject implements Hello {
- /* 構造函數 */
- public HelloImpl() throws RemoteException {
- super();
- }
- /* 實現本地接口中聲明的'sayHello()'方法 */
- public String sayHello(String message) throws RemoteException {
- System.out.println("我在RMI的服務器端,客戶端正在調用'sayHello'方法。 ");
- System.out.println("Hello " + message);
- return message;
- }
- }
3.RMI服務器類
該類建立遠程對象實現類HelloImpl的一個實例,而後經過一個專有的URL來註冊它。所謂註冊就是經過Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,將HelloImpl實例綁定到指定的URL上。框架
- HelloServer.java
- /*
- * @author javamxj (CSDN Blog) 建立日期 2004-12-27
- */
- import java.rmi.*;
- public class HelloServer {
- public static void main(String[] args) {
- // 在服務器端設置安全機制
- /*
- if (System.getSecurityManager() == null) {
- System.setSecurityManager(new RMISecurityManager());
- }
- */
- try {
- System.out.println("開始 RMI Server ...");
- /* 建立遠程對象的實現實例 */
- HelloImpl hImpl = new HelloImpl();
- System.out.println("將實例註冊到專有的URL ");
- Naming.rebind("HelloService", hImpl);
- System.out.println("等待RMI客戶端調用...");
- System.out.println("");
- } catch (Exception e) {
- System.out.println("錯誤: " + e);
- }
- }
- }
請注意有關 rebind 方法調用的下列參數:eclipse
- HelloClient.java
- /*
- * @author javamxj (CSDN Blog) 建立日期 2004-12-27
- */
- import java.rmi.*;
- public class HelloClient {
- public static void main(String[] args) {
- // 在服務器端設置安全機制
- /*
- if (System.getSecurityManager() == null) {
- System.setSecurityManager(new RMISecurityManager());
- }
- */
- /* 默認爲本地主機和默認端口 */
- String host = "localhost:1099";
- /* 帶輸入參數時,將host設置爲指定主機 */
- if (args.length > 0)
- host = args[0];
- try {
- /* 根據指定的URL定位遠程實現對象 */
- /* 「h」是一個標識符,咱們將用它指向實現「Hello」接口的遠程對象 */
- Hello h = (Hello) Naming.lookup("rmi://" + host + "/HelloService");
- System.out.println("實現「Hello」接口的遠程對象: " + h);
- System.out.println("我在客戶端,開始調用RMI服務器端的'sayHello'方法");
- System.out.println("歡迎, " + h.sayHello("javamxj blog"));
- } catch (Exception ex) {
- System.out.println("錯誤 " + ex);
- }
- }
- }
2、設置開發環境 socket
在安裝好插件包後,咱們來設置RMI開發環境。啓動Eclipse,在菜單window->preferences對話框中,選中左邊樹菜單java->rmi,右邊窗口會出現RMI Plugin的默認設置信息。 最上面的Path to RMI registry設置java的RMI Registry的路徑,如這裏設置的是C:/Program Files/Java/jdk1.5.0_05/bin/rmiregistry.exe,通常不用管它。下面的一個框是RMI的服務端口,默認是 1099,這個相似tomcat的服務端口8080同樣,連接的時候須要找到對應的端口才能連接上。其實RMI的最低層是socket。 這裏須要特別指出的是RMI Plugin是個收費的Eclipse插件,有15天的免費試用期。而RMI屬性中最大的窗口就是填使用受權信息的。分佈式
這也就是開發環境的基本設置,主要是須要RMI的插件和設置。ide
3、運行調試項目函數
在運行以前須要進行一下設置,不然,會提示錯誤信息,說找不到stub類。
1、啓動RMIRegistry
Eclipse菜單window->show view->others,在彈出菜單中選擇RMI Views>RMI Registry Inspector,這是會多出來一個窗口,這裏能夠顯示已經註冊的RMI應用。點擊工具條上的RMI Plugin圖標,在菜單中選擇Start Local Registry。注意這個只須要啓動一次,除非你把它關掉。
2、配置運行RMI服務 右鍵點擊左邊樹中的RMI_Server.java文件,菜單Debug As ->RMI Application。在彈出對話框中找到RMI Properties標籤頁。 這時這裏前兩項顯示紅色。 選中java.security.police項的value框,點擊選擇按鈕會出現文件選擇對話框,咱們這裏設置成C:/Program Files/Java/jre1.5.0_05/lib/security/java.security。就是jre的安全策略配置文件,要選擇成泥當前用的jdk的側略文件。選中第二項java.rmi.server.codebase的value項,這裏選擇編譯後類包所在的文件夾。點擊選擇按鈕->add按鈕->pick from workspace,選擇當前工程RMITest的bin文件夾。這裏是file:/E:/workspace/RMITest/bin/。(這裏有點要補充一下,還能夠 點擊選擇按鈕->add按鈕->compute from classpath)。
以上是運行RMI Application,可是個人電腦沒顯示RMI Application,當時這個窗口也顯示不到任何RMI項目
這時沒法啓動RMIRegistry ,所以只能手動啓動RMIRegistry
這裏啓動完成RMI註冊,而且會在工程的bin路徑下生成先關的stub類。在運行服務器類和客戶端類就完成了。注意這個RMI註冊只只能啓動一次,除非你把它關掉。