<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    kapok

    垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks

    http://xs.blogchina.com/article_193148.1248322.html

     

    Java 遠程方法調用(RMI)

     1. RMI 簡介 
     2. RMI 體系結構
     3. 遠程異常
     4. 服務器開發步驟概述
     5. 編寫遠程接口
     6. 實現遠程接口
     7. 編寫 RMI 服務器概述
     8. 設置安全性管理器
     9. 命名遠程對象
     10. 生成存根和框架
     11. 客戶機開發概述
     12. 應用程序 vs. applet
     13. 編寫 RMI 客戶機應用程序
     14. 設置安全性管理器
     15. 查找對象
     16. 調用遠程方法
     17. 編寫 RMI 客戶機 applet
     18. 編寫用于 applet HTML 頁面
     19. 部署概述
     20. 啟動 RMI 注冊表
     21. 啟動對象服務器
     22. 運行客戶機應用程序
     23. 運行客戶機 applet

     

    RMI 簡介
    第 1 頁(共23 頁)
    我們將從 Java 遠程方法調用(RMI)開始討論,Java 1.1 中引入了這種技術。
    RMI 的用途是使分布在不同虛擬機中的對象的外表和行為都象本地對象一樣。調用遠程對象的虛擬機有時稱為客戶機。類似地,我們將包含遠程對象的虛擬機稱為服務器。
    獲取遠程對象的引用和獲取本地對象的引用有點不同,但一旦獲得了引用,就可以象調用本地對象一樣調用遠程對象,如下面的代碼片段所示。RMI 基礎結構將自動截取請求,找到遠程對象,并遠程地分派請求。
    這種位置透明性甚至包括垃圾收集。也就是說,客戶機不必特地釋放遠程對象,RMI 基礎結構和遠程虛擬機為您處理垃圾收集。

    RMI 體系結構
    第 2 頁(共23 頁)
    為了實現位置透明性,RMI 引入了兩種特殊類型的對象:存根(stub框架(skeleton
    存根是代表遠程對象的客戶機端對象。存根具有和遠程對象相同的接口或方法列表,但當客戶機調用存根方法時,存根通過 RMI 基礎結構將請求轉發到遠程對象,實際上由遠程對象執行請求。
    在服務器端,框架對象處理"遠方"的所有細節,因此實際的遠程對象不必擔心這些細節。也就是說,您完全可以象編碼本地對象一樣來編碼遠程對象。框架將遠程對象從 RMI 基礎結構分離開來。在遠程方法請求期間,RMI 基礎結構自動調用框架對象,因此它可以發揮自己的作用。
    關于這種設置的最大的好處是,您不必親自為存根和框架編寫代碼。JDK 包含工具 rmic,它會為您創建存根和框架的類文件。

    遠程異常
    第 3 頁(共23 頁)
    實際上,RMI 使用 TCP/IP 套接字來傳達遠程方法請求。盡管套接字是相當可靠的傳輸,但還是有許多事情可能出錯。例如,假設服務器計算機在方法請求期間崩潰了。或者,假設客戶機和服務器計算機是通過因特網連接的,而客戶機掉線了。
    關鍵在于,使用遠程對象時比使用本地對象時有更多可能出錯的機會。因此客戶機程序能夠完美地從錯誤中恢復就很重要了。
    因此要讓客戶機知道此類錯誤,每個將要被遠程調用的方法都必須拋出 RemoteException,java.rmi 包中定義了該異常。

    服務器開發步驟概述
    第 4 頁(共23 頁)
    讓我們研究一下編寫對象服務器所涉及的步驟。我們將花一些時間研究客戶機端。
    您需要做的第一件事情是定義用于遠程對象的接口。這個接口定義了客戶機能夠遠程地調用的方法。遠程接口和本地接口的主要差異在于,遠程方法必須能拋出上一頁描述的 RemoteException。
    接下來,編寫一個實現該接口的類。
    然后,編寫在服務器上運行的主程序。這個程序必須實例化一個或多個服務器對象,然后,通常將遠程對象注冊到 RMI 名稱注冊表,這樣客戶機就能夠找到對象。
    最后,生成存根和框架的代碼。JDK 提供了 rmic 工具,它讀取遠程對象的類文件并為存根和框架創建類文件。
    編寫遠程接口
    第 5 頁(共23 頁)
    下面的代碼顯示了一個簡單遠程接口的接口定義。實現這個接口的對象提供三個方法:一個方法返回字符串、一個方法接受字符串作為參數、而另一個方法不接受參數也不返回任何結果。正如先前提到的,這些方法必須能拋出 RemoteException,如果客戶機和服務器之間的通信出錯,則客戶機將捕獲此異常。
    注:該接口本身繼承了 java.rmi 包中定義的 Remote 接口。Remote 接口本身沒有定義方法,但通過繼承它,我們說明該接口可以被遠程地調用。
    這里是編寫遠程接口的代碼:
    import java.rmi.*;
    public interface Meeting extends Remote
    {
      public String getDate ()
         throws RemoteException;
      public void setDate ( String date )
         throws RemoteException;
      public void scheduleIt()
         throws RemoteException;
    }
    實現遠程接口
    第 6 頁(共23 頁)
    現在,讓我們研究一個實現遠程 Meeting 接口的類。通常,MeetingServer 繼承 UnicastRemoteObject 類,UnicastRemoteObject 類提供遠程對象所需的基本行為。術語"單播(unicast)"是指每個客戶機存根引用單個遠程對象的現象。以后,RMI 可能會允許"多播(multicasting)",即一個存根可以引用幾個對等的遠程對象。使用多播,RMI 基礎結構可以均衡一組遠程對象之間的負載。
    下面的代碼樣本顯示了兩個方法的實現:Meeting 接口中定義的 getDate 方法和一個無參數構造器。請注意:這兩者都拋出 RemoteException;所有由客戶機遠程調用的方法和構造器都需要拋出這個異常。在本示例中,構造器無實際工作可做,但我們還是需要定義它,這樣它能夠拋出遠程異常。
    但是 getDate 方法很有趣。它向調用者返回一個字符串的引用。雖然這看起來可能很簡單,但是,在這里 RMI 基礎結構和框架以及存根實際上有很多工作要做。它們必須協同工作,以便將字符串的一個副本傳回客戶機,然后,在客戶機的虛擬機中作為對象重新創建。
    這里是實現遠程接口的代碼:
    import java.rmi.*;
    import java.rmi.server.*;
    public class MeetingServer
      extends UnicastRemoteObject
      implements Meeting
    {
      private String ivDate = new String ( "1/1/2000" );
      public MeetingServer()
        throws RemoteException
      {
      }
     
      public String getDate()
        throws RemoteException
      {
        return ivDate;
      }
    ...
    }
    編寫 RMI 服務器概述
    第 7 頁(共23 頁)
    除了實現接口之外,我們還需要編寫服務器的主程序。目前 RMI 不支持作為 applet 的服務器程序,所以主程序必需是獨立的 Java 應用程序。您要么為主程序編碼一個單獨的 Java 類,要么象我們在這里所做的一樣,只在實現類中編碼一個 main 方法。
    還請注意,我們編碼的 main 函數可以向命令行拋出任何與 RMI 相關的異常。對于象本文中的小樣本程序,這樣做沒有問題,但在實際程序中,您可能要將執行的步驟包括到獨立的 try-catch 塊中,從而能夠更好地執行錯誤處理。
    這里是編寫 RMI 服務器的代碼結構:
    import java.rmi.*;
    import java.rmi.server.*;
    public class MeetingServer
      extends UnicastRemoteObject
      implements Meeting
    {
      ...
      public static void main (String [] args ) throws
        RemoteException, java.net.MalformedURLException,
        RMISecurityException
      {
        // 1. Set Security manager
        // 2. Create an object instance
        // 3. Register object into the name space
      }
    }
    *** 本圖將被刪除。留在這里僅供對照/檢查用 ***
    服務器 main 通常要做的步驟是:
    1. 安裝安全性管理器類,它允許服務器程序從其它機器接收存根類
    2. 創建服務器對象的實例
    3. 將服務器對象注冊到 RMI 命名注冊表以便客戶機程序能找到該服務器對象
    現在,讓我們進一步研究這些步驟。
    設置安全性管理器
    第 8 頁(共23 頁)
    第一步是安裝 RMI 安全性管理器。盡管這不是嚴格必須的,但它確實允許服務器虛擬機下載類文件。例如,假設客戶機調用服務器中的方法,該方法接受對應用程序定義的對象類型(例如 BankAccount)的引用。通過設置安全性管理器,我們允許 RMI 運行時動態地將 BankAccount 類文件復制到服務器,從而簡化了服務器上的配置。
    讓 RMI 動態地下載這些類的弊端是有安全性風險。也就是說,實質上我們是在讓服務器執行來自另一臺機器的代碼。雖然我們希望這些類文件不會危及服務器,但如果希望避免這樣的風險,則您的 RMI 服務器不應該安裝安全性管理器。然后,您必須確保將所有類文件安裝在本地服務器的類路徑中。
    這里是用于設置安全性管理器的代碼:
    import java.rmi.*;
    import java.rmi.server.*;
    public static void main (String [] args ) throws
        RemoteException, java.net.MalformedURLException,
        RMISecurityException
    {
        System.setSecurityManager (
            new RMISecuritymanager() );
            
        MeetingServer ms = new MeetingServer();
       
        Naming.rebind (
          "rmi://myhost.com/Meeting", ms );
    }
    *** 本圖將被刪除。留在這里僅供對照/檢查用 ***
    注:傳遞對象參數類型是涉及許多方面的主題,因為有兩種方法實現它。一種是在通信線路上僅傳遞引用;另一種是將對象序列化并在遠程創建新對象。在本教程中,我們不會更深入地討論這些問題,但您應該閱讀 JDK 中的 RMI 文檔以獲取更多詳細信息。
    命名遠程對象
    第 9 頁(共23 頁)
    服務器的下一步工作是創建服務器對象的初始實例,然后將對象的名稱寫到 RMI 命名注冊表。RMI 命名注冊表允許您將 URL 名稱分配給對象以便客戶機查找它們。要注冊名稱,需調用靜態 rebind 方法,它是在 Naming 類上定義的。這個方法接受對象的 URL 名稱以及對象引用。
    名稱字符串是很有趣的部分。它包含 rmi:// 前綴、運行 RMI 對象的服務器的計算機主機名和對象本身的名稱,這個名稱正是您所想要的。注:您可以調用由 java.net.InetAddress 類定義的 getLocalHost 方法,而不必象我們在這里所做的一樣硬編碼主機名。
    這里是命名遠程對象的代碼:
    import java.rmi.*;
    import java.rmi.server.*;
    public static void main (String [] args ) throws
        RemoteException, java.net.MalformedURLException,
        RMISecurityException
    {
        System.setSecurityManager (
            new RMISecuritymanager() );
           
        MeetingServer ms = new MeetingServer();
       
        Naming.rebind (
          "rmi://myhost.com/Meeting", ms );
    生成存根和框架
    第 10 頁(共23 頁)
    編寫并編譯了服務器實現之后,就準備創建存根和框架類。那很容易:只要運行 JDK 的 rmic 命令,指定實現類文件名(不帶擴展名)。rmic 工具將為每個類文件創建一個存根和一個框架。然后,您需要正確地部署這些文件,在討論完編寫客戶機端代碼之后,我們將討論部署問題。

    客戶機開發概述
    第 11 頁(共23 頁)
    現在,讓我們研究客戶機端。首先,您必須確定是想編寫客戶機獨立應用程序還是客戶機 applet。應用程序的設置簡單些,但 applet 更容易部署,因為 Java RMI 基礎結構能夠將它們下載到客戶機機器。我們將討論如何實現這兩者。
    在客戶機中,代碼需要首先使用 RMI 注冊表來查找遠程對象。一旦這樣做了之后,客戶機就可以調用由遠程接口定義的方法。
    應用程序 vs. applet
    第 12 頁(共23 頁)
    讓我們來簡略看一下 Java 應用程序和 applet 之間的差異。如果編寫應用程序,必須定義一個 main 入口點,可以從中執行 RMI 啟動代碼。然后,您必須在客戶機機器上安裝應用程序的類文件。如果有多臺客戶機計算機,則您必須在每臺機器上手工安裝這個應用程序的類文件。并且,正如我們過一會兒將要看到的,您還要在客戶機應用程序計算機上安裝一些與 RMI 相關的服務器文件。
    相反,如果您決定編寫一個 applet,則不需要 main 入口點。applet 重寫了由瀏覽器調用的 init 方法。可以在 init 中編寫與您在應用程序的 main 中編寫的同類代碼。applet 的主要優點是,除了瀏覽器,您不必在客戶機計算機上預安裝任何東西 ― Java RMI 基礎結構將自動下載所有必要的類文件。但是,請注意,您必須編寫一個瀏覽器能夠裝入的 HTML 文件。我們將簡略地討論這一切。
    編寫 RMI 客戶機應用程序
    第 13 頁(共23 頁)
    讓我們研究一下編寫 RMI 獨立應用程序所包含的步驟。我們照常將 main 方法編碼為入口點,并且在其中執行 RMI 初始化步驟。首先設置安全性管理器,以便 RMI 運行時能夠下載類文件,然后通過使用 RMI 命名注冊表獲取一個對遠程對象的引用。最后我們就能夠調用遠程方法了。
    這里是編寫 RMI 客戶機應用程序的代碼:
    import java.rmi.*;
    public class MeetingClient
    {
      public static void main ( String [] args )
        throws RemoteException,
               java.net.MalformedURLException,
               java.rmi.NotBoundException
      {
        // 1. Set Security Manager
        // 2. Look up remote object from name space
        // 3. Call remote methods
      }
    }
    *** 本圖將被刪除。留在這里僅供對照/檢查用 ***
    雖然這個代碼顯示了僅在 main 方法中調用遠程方法,但一旦應用程序檢索到對象引用,則應用程序也可以在其它方法中調用遠程方法。此外,請注意,不需要進行清理,即使對遠程對象,Java RMI 基礎結構也會保證進行垃圾收集工作。
    現在我們將更詳細地討論這些步驟。
    設置安全性管理器
    第 14 頁(共23 頁)
    該代碼看起來和對象服務器 main 中的代碼類似。象對象服務器一樣,客戶機應用程序也可以選擇是否設置安全性管理器。并且原因也相似:RMI 運行時會自動將遠程對象的存根類文件下載到客戶機,但僅當應用程序安裝了安全性管理器時才能這樣做。如果應用程序使用缺省的安全性管理器,則需要在客戶機計算機的類路徑預安裝存根類文件,否則應用程序將捕獲到一個安全性異常。
    還應該注意,在這個代碼中 main 方法只是將與 RMI 相關的異常拋回到命令行。更健壯的應用程序應該包含 try-catch 塊以便本地進行錯誤處理。
    這里是設置安全性管理器的代碼:
    import java.rmi.*;
      public static void main ( String [] args )
        throws RemoteException,
               java.net.MalformedURLException,
               java.rmi.NotBoundException
      {
        System.setSecurityManager(new RMISecurityManager());
        ...
       
      }

    查找對象
    第 15 頁(共23 頁)
    一旦應用程序安裝了可使用的安全性管理器,它就可以從 RMI 命名注冊表檢索遠程對象的引用。要這樣做,需調用靜態 lookup 方法,傳遞對象服務器為遠程對象所注冊的相同名稱。lookup 方法將檢索對遠程對象的引用并創建存根對象,這里,存根對象存儲在變量 r 中。
    如果客戶機提供的名稱與注冊表中的名稱不匹配,則 lookup 方法拋出 NotBoundException。如果所提供的 URL 無效,則 lookup 拋出 MalformedURLException。在下面的這個簡單的代碼片段中,沒有顯式地捕獲這些異常,但在實際程序中您需要這樣做。
    請注意返回的引用類型是 Remote 類型,它是所有遠程對象的超類。但是實際上,我們想要的是作為遠程接口中定義的對 Meeting 接口的引用。因此,我們需要如下一頁所述那樣對引用進行向下強制類型轉換。
    這里是查找對象的代碼:
    import java.rmi.*;
      public static void main ( String [] args )
        throws RemoteException,
               java.net.MalformedURLException,
               java.rmi.NotBoundException
      {
        System.setSecurityManager(new RMISecurityManager());
        Remote r = Naming.lookup {
            "rmi://myhost.com/Meeting" );
        ...
      }
    調用遠程方法
    第 16 頁(共23 頁)
    在應用程序能夠調用遠程方法之前,它必須轉換遠程引用的類型以匹配接口定義,在本示例中是 HelloInterface。雖然您可以使用簡單的強制類型轉換做到這一點,但這里顯示的代碼首先通過調用 instanceof 運算符來檢查強制類型轉換是否有效。當遠程對象不是預期的類型時,這種技術可使您可以避免 InvalidCast 運行時異常。
    一旦我們成功地對引用進行了強制類型轉換,就可以調用遠程方法;這里是 getDate 方法,它返回一個字符串。
    這里是調用遠程方法的代碼:
    import java.rmi.*;
      public static void main ( String [] args )
        throws RemoteException,
               java.net.MalformedURLException,
               java.rmi.NotBoundException
      {
        ...
        Remote r = Naming.lookup (
            "rmi://myhost.com/Meeting");
       
        String s = null;
       
        if (r instanceof Meeting )
        {
          ms = (Meeting)r;
          s = ms.getDate();
        }
      }
    編寫 RMI 客戶機 applet
    第 17 頁(共23 頁)
    現在,讓我們研究將 RMI 客戶機編寫為 applet 而不是獨立應用程序時這兩者的差異。有三個基本差異:
    1. 通常的 applet 是在 init 方法而不是在 main 編碼 RMI 初始化。
    2. 因為您不能更改 init 的方法說明(正在從 Applet 重寫它),所以不能將 init 編碼為可拋出的異常。因此必須用 try-catch 塊處理異常。
    3. 不必安裝 RMI 安全性管理器,因為 applet 自動使用允許下載遠程類的 AppletSecurityManager。
    盡管有這些不同,applet 客戶機中與 RMI 相關的代碼和應用程序中的基本相同。在這里仍然要使用 RMI 命名注冊表來查找遠程引用,并將返回的引用強制轉換成正確類型等。
    applet 和應用程序之間的另一個差異是:要在瀏覽器內使用 applet,必需編寫引用 applet 的 HTML 頁面。在下一頁我們研究這個問題。
    這里是編寫 RMI 客戶機 applet 的代碼:
    import java.rmi.*;
    public class MeetingClientApplet extends java.applet.Applet
    {
      public void init ()
      {
        try
        (
          //1. Look up remote object in the RMI registry
          //2. Call remote methods (can also call from
          //   other methods if you save th reference)
        }
        catch ( Exception e )
        {
        }
      }
    }
    編寫用于 applet HTML 頁面
    第 18 頁(共23 頁)
    這是一個簡單的 HTML 文件,它裝入上一頁顯示的 applet。HTML 頁面中關鍵的一行是 applet 標記,在這個標記中指定 applet 的類文件(無文件擴展名)。然后,需要在 Web 服務器上安裝該 HTML 文件和 applet 類文件。當用戶在其支持 Java 平臺的瀏覽器中顯示這個頁面時,瀏覽器會將 applet 類文件下載到客戶機計算機,并調用 init 方法,在本示例中,它開始 RMI 通信。
    <HML>
    <title>Meeting Client Applet</title>
    ...
    <applet code="MeetingClientApplet" width=500 height=120>
    </appleet>
    </HTML>
    下一步任務是研究如何部署 RMI 代碼。我們將研究兩種情況:部署客戶機獨立應用程序和部署客戶機 applet
    部署概述
    第 19 頁(共23 頁)
    部署 RMI 程序所包括的步驟有:
    • 啟動運行在 RMI 對象服務器上的 RMI 注冊表程序。
    • 啟動對象服務器主程序。
    • 設置 Web 或 ftp 服務器以便 RMI 運行時能夠如先前所述那樣下載類文件。
    • 運行客戶機應用程序或在瀏覽器中顯示帶有 applet 的 HTML 頁面。
    讓我們更詳細地研究每個步驟。
    啟動 RMI 注冊表
    第 20 頁(共23 頁)
    部署的第一步是啟動對象服務器計算機上的 RMI 命名注冊表。Java Development Kit 中包含了 rmiregistry 命令。
    下圖顯示了在一個單獨窗口中啟動注冊表的 Microsoft Windows 命令(start rmiregistry)。有關特定的指示,請參閱您的操作系統文檔。
    注冊表程序管理從名稱到對象引用的映射,以便程序能夠調用 Naming.bind 來注冊名稱,以及調用 Naming.lookup 來檢索引用。
    一個告誡:當啟動注冊表時,請確保有效的類路徑沒有引用服務器上的存根類文件。如果引用的話,則 RMI 基礎結構不會自動將存根下載到客戶機計算機。

    啟動對象服務器
    第 21 頁(共23 頁)
    啟動注冊表之后,接下來我們可以啟動服務器計算機上的 RMI 對象服務器主程序。和啟動注冊表類似,這一步與客戶機是 applet 還是應用程序無關。
    請記住我們編碼 main 方法,以創建對象并將對象的名稱注冊到 RMI 注冊表中。下圖顯示了包含 MeetingServer 遠程對象及其框架的 MeetingServer 虛擬機。(java -Djava.rmi.server.codebase=http://mywebserver.com/ -Djava.security.policy=mypolicy MeetingServer)
    對象服務器虛擬機需要訪問圖中顯示的所有類文件:MeetingServer 主程序、框架類文件和接口類文件。因此,在啟動服務器程序之前,您必須確保所有這些文件都在類路徑中。存根類文件必須安裝在 Web 服務器上;注:我們在命令中引用 Web 服務器以啟動對象服務器主程序。在本示例中,代碼庫特性僅指定主機名,而沒有指定目錄,所以 Web 服務器將從其缺省目錄提供服務。有關如何設置目錄的更多詳細信息,請參閱 Web 服務器文檔。
    從 JDK 1.2 開始,RMI 服務器還需要引用一個策略文件,該文件授予或拒絕遠程對象的權限。在本示例中,我們創建了一個授予所有權限的策略文件;對象這樣的樣本程序而言,這沒有問題,但對于生產環境這樣做可能太危險了。注:當啟動對象服務器時,必須指定策略文件。
    和以前一樣,本圖顯示了用來運行對象服務器 main 程序的 Microsoft Windows 命令。有關具體細節,請參閱操作系統文檔。

    運行客戶機應用程序
    第 22 頁(共23 頁)
    現在,讓我們研究運行客戶機程序。我們將從研究作為獨立應用程序的客戶機開始,然后再討論客戶機 applet。
    客戶機計算機上的虛擬機需要訪問客戶機程序本身的類文件和遠程接口的類文件;必須在客戶機類路徑中安裝這些文件。客戶機還需要訪問存根類,但不必在客戶機上安裝這個文件。RMI 運行時會自動按需下載存根類。請記住,為了利用這個特性,我們需要在客戶機應用程序中安裝安全性管理器。因此我們可以將存根類文件放置在運行 Web 服務器的計算機上,而不是安裝在客戶機上。
    當我們運行客戶機應用程序時(請參閱命令提示 java -Djava.rmi.server.codebase=http://mywebserver.com/ -Djava.security.policy=mypolicy MeetingClient),指定代碼庫特性來指明去哪里可以找到存根類文件。如果您不希望動態下載存根或沒有 Web 服務器,那么可以將存根類文件手工復制到客戶機計算機上的類路徑。
    注:一旦下載了存根,與 RMI 服務器的所有進一步的交互就都使用 RMI 協議。這包含命名注冊表中的查找和遠程方法調用和返回。
    正如我們在服務器中看到的那樣,在 JDK 1.2 和更高版本中,客戶機還需要使用策略文件。這里,我們將服務器上所使用的策略文件復制到了客戶機上,所以可以方便地在命令行上引用它。
    注:使用 ftp 協議而不是 http 來將存根下載到客戶機,這也是有可能的。有關詳細信息,請參閱 JDK 文檔。

    運行客戶機 applet
    第 23 頁(共23 頁)
    運行客戶機 applet 和運行獨立應用程序頗有些不同。一個差異是您通常從運行在客戶機計算機上的瀏覽器內運行 applet。當然,瀏覽器需要支持 Java 平臺。
    另一個差異是因為 applet 已經支持下載類文件,所以除了要重裝瀏覽器之外,不必在客戶機計算機上預安裝任何東西。與應用程序不同,您可以將所有必需的 HTML 文件和類文件都放置在 Web 服務器上,applet 和 RMI 基礎結構會按需下載這些文件。我們也不必關心客戶機上的策略文件。
    還有另一個關于 applet 的復雜問題:如果希望對象服務器和 Web 服務器駐留在不同的主機上,則需要了解對 applet 進行數字簽名。那是因為,缺省情況下,瀏覽器安全性管理器僅允許網絡訪問(包括 RMI 方法)返回到 Web 服務器。也就是說,除非對 applet 進行了簽名,否則,如果將對象分發到不是 Web 服務器的服務器上,您將會看到安全性違例。數字簽名這個主題已經超出了這個簡短課程的范圍之外。
    最后,應該注意,實際上,有可能編寫獨立應用程序,以便可以按需下載幾乎所有東西,類似于這里所討論的 applet。要獲取更多詳細信息,請參考關于自舉應用程序的 JDK 文檔。
    關于 RMI,我們已經討論得夠多了,足夠讓您開始編寫和部署自己的分布式程序。現在,讓我們研究用于分布式對象的另一種基礎結構:CORBA 方法。
    posted on 2005-06-15 11:40 笨笨 閱讀(2802) 評論(2)  編輯  收藏 所屬分類: J2EEALL

    評論

    # re: Java 遠程方法調用(RMI)[未登錄] 2011-10-24 10:48 匿名
    干嘛藏這么深?資源應該共享的是吧。!  回復  更多評論
      

    # re: Java 遠程方法調用(RMI) 2013-04-12 16:02 nx
    if (r instanceof Meeting )
    這個Meeting從哪里來?  回復  更多評論
      

    主站蜘蛛池模板: 日韩视频免费在线| 日韩精品视频免费在线观看| 日韩精品亚洲aⅴ在线影院| 免费人成动漫在线播放r18 | 91久久成人免费| 亚洲视屏在线观看| 久久国产免费福利永久| 亚洲三级视频在线观看| 成人啪精品视频免费网站| 亚洲精品精华液一区二区 | 国产偷国产偷亚洲清高动态图 | 亚洲 自拍 另类小说综合图区 | 中文字幕免费在线看线人 | 亚洲一区二区三区成人网站 | 亚洲国产精品久久人人爱| 性xxxxx免费视频播放| 亚洲日韩国产欧美一区二区三区 | 亚洲爆乳无码精品AAA片蜜桃| 国产精品深夜福利免费观看| 成年网在线观看免费观看网址| 亚洲日韩aⅴ在线视频| 最近免费中文字幕大全免费版视频 | 久久青草亚洲AV无码麻豆| 国产成人精品免费视频大全麻豆| 精品国产日韩久久亚洲| 亚洲精品成人网久久久久久| 久久青草免费91观看| 亚洲综合一区二区三区四区五区| 四虎免费永久在线播放| 国产成人久久AV免费| 亚洲视频无码高清在线| 亚洲av手机在线观看| 国产高清不卡免费视频| 亚洲av无码专区在线观看亚| 亚洲日本va中文字幕久久| 美女裸身网站免费看免费网站| 亚洲欧美在线x视频| 久久精品亚洲中文字幕无码网站 | 成人免费午夜在线观看| 国产黄片不卡免费| 国产午夜亚洲精品|