初碰J2EE:RMI灰頭灰腦篇

RMI概念:爲通過網絡執行其他機器上的代碼,傳統的方法不僅難以學習,而且易出錯。解決這個問題的最佳方法是:某些對象正好位於另一臺機器,我們可以發送一條消息,並獲得返回結果,就像位於自己的本機器一樣。java遠程方法調用(rmi)特性使客戶機上運行的程序可以調用遠程服務器上的對象。遠程方法調用特性使java編程人員能夠在網絡環境中分佈操作。

       接觸java有一段時間了,平時就只是寫點jsp+servlet+bean.某天突然心血來潮,決定去碰碰j2ee中的其他技術,先是javamail,這個簡單(嘿嘿,其實就只是寫幾個例子而已),沒碰到什麼讓我頭疼的問題.接下來EJB,對實現EJB需要兩個接口一個類的做法感到非常的厭煩(不過好像聽說EJB3.0就不需要了,還接觸過,有機會看看資料).然後就是RMI了.照着書上依樣畫葫蘆,代碼如下:

package rmi;
import java.rmi.*;
public interface PerfectTimeI extends Remote {
  long getPerfectTime()throws RemoteException;
}

package rmi;
import java.net.*;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI {
   public PerfectTime()throws RemoteException{
      super();
 }
  public long getPerfectTime()throws RemoteException{
    return System.currentTimeMillis();
   }
   public static void main(String[] args)throws Exception{
   System.setSecurityManager(new RMISecurityManager());
    java.rmi.registry.LocateRegistry.createRegistry(2005);
    try{
          PerfectTime pt=new PerfectTime();
          Naming.rebind("//localhost:2005/PerfectTime",pt);
          System.out.println("Ready to do Time");
     }catch(Exception e){
         e.printStackTrace();
    }
  }
}

package rmi;
import java.rmi.*;
import java.rmi.*;

public class DisplayPerfectTime {
   public DisplayPerfectTime(){
      super();
  }
  public static void main(String[] args){
    System.setSecurityManager(new RMISecurityManager());
    try{
         PerfectTimeI t=(PerfectTimeI)Naming.lookup("//localhost:2005/PerfectTime");
         for(int i=0;i<10;i++){
            System.out.println("PerfectTime:"+t.getPerfectTime());
      }
    }catch(Exception e){
       e.printStackTrace();
   }
 }
}

然後運行在JBX裏點擊run??? 結果$#$%#!!%$#
java.rmi.StubNotFoundException: Stub class not found: rmi.PerfectTime_Stub;
暈,遇到第一個問題.忘記生成Stub和Skel了.在JBX裏找了半天也沒找到可以生成這兩個文件的命令或者選項......鬱悶!!看來只會回到原始社會用命令行模式了.
運行cmd.exe
d:/rmi/classes>rmic PerfectTime? 回車
error:Class test.PerfectTime not found.
1 error

...........
MyGod.我都看見這個class了你這個RMIC竟然沒看見,難道比我近視.
記起剛接觸java的時候執行頭一個class的時候也發生過這樣的問題,當初是怎麼解決的呢,
@_@暈,原來還要加classpath.趕緊把d:/rmi/classes/加進了classpath中(中間要感謝水人對我的提醒).在運行cmd.exe
d:/rmi/classes>rmic PerfectTime? 回車
d:/rmi/classes>

回到rmi目錄下一看.哈哈真的生成了PerfectTime_Skel.class和PerfectTime_Stub.class這兩個文件了.Y

好,回到JBX繼續run我的程序.這次拋出了
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:2005 connect,resolve)
好像沒有權限去執行這個服務端程序.???!!!我自己的機器我執行程序都要權限嗎!TMD.心裏罵了無數邊這個破東西.沒辦法上網查查到底是什麼問題.

結果找了一些資料都說要配置安全策略.但都說不清不楚.還說調用的時候要加參數之類的.逐一試過.都不行.頭有點麻了.從我學JAVA以來還沒有在一個例子上被折騰這麼長時間的.回頭又看了看例子的源碼.發現有一句代碼:System.setSecurityManager(new RMISecurityManager());服務端和客戶端都用了這樣的一句.感覺這句話可要可不要,心裏想着註釋掉看看.繼續run我的程序..........
C:/bea/jdk141_05/bin/javaw -classpath "D:/rmi/classes;C:/bea/weblogic81.....
Ready to do Time

耶!!!!竟然運行成功了.接着把客戶端的哪句話也註釋掉了.同樣,也運行成功了.
然後把剛纔添加的幾個安全策略文件也刪了,在run.結果還是成功!!

雖然運行成功了,但又有新的問題出現了,爲什麼把這句話去掉後就能運行了.
上google.搜索System.setSecurityManager(new RMISecurityManager());結果找到一篇文章上說:
爲了防止可能發生的任何安全上的疏忽,在程序中需要透過System.setSecurityManager(new RMISecurityManager())來設定系統安全相關的策略.暈,弄了半天還是安全策略沒有配好,我不是真的運行成功了,我只是繞開了安全策略的限制而已.
相關文章的地址:http://my.so-net.net.tw/idealist/Java/RMI.html
上面還有安全策略的詳細配置..(這個等我慢慢琢磨,明白了再寫出來.嘿嘿.今天就偷偷懶吧)
待續.....TO BE CONTINUE

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