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

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

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

    codefans

    導航

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統計

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    程序設計鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    RMI入門

    來源:http://ybwen.home.chinaren.com

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

    下面介紹一下必要的步驟,創建自己的RMI對象。

    一、遠程接口概念:

         RMI對接口有著強烈的依賴。在需要創建一個遠程對象的時候,我們通過傳遞一個接口來隱藏基層的實施細節。所以客戶得到遠程對象的一個句柄正好同一些本地的根代碼連接,有后者負責通過網絡通信。但我們并不關心這些事情,通過自己的接口句柄發送消息即可。

       創建一個遠程接口時,必須遵守下列規則:

    1)  遠程接口必須為public屬性(不能有“包訪問”;也就是說,他不能是“友好的”)。否則,一旦客戶試圖裝載一個實現了遠程接口的遠程對象,就會得到一個錯誤。

    2)  遠程接口必須擴展接口java.rmi.Remote。

    3)  除與應用程序本身有關的違例,遠程接口中的每個方法都必須在自己的throws從句中聲明java.rmi.RemoteException.

    4)  作為參數或返回值傳遞的一個遠程對象(不管是直接,還是本地對象中嵌入)必須聲明為遠程接口,不可聲明為實施類。

    下面是一個遠程接口示例,

    //PerfectTimeI.java
    //The PerfectTime remote interface
    package rmi.sample.server;
    import java.rmi.*;
    public interface PerfectTimeI extends Remote { 
        long getPerfectTime() throws RemoteException;
    }

    它表面上與其他的接口類似,只是對Remote進行了擴展,而且所有的方法都會“擲”出RemoteException.接口和方法都是Public的。

    編譯PerfectTimeI.java,生成PerfectTimeI.class(test是包,編譯時注意路徑)

    javac rmi.sample.server.PerfectTimeI.java

    二、遠程接口的實施:

        服務器必須包含一個擴展了UnicastRemoteObject類,并實現遠程接口。這個類也可以含有附加的方法,但客戶只能使用遠程接口中的方法。因為客戶是指向接口的一個句柄,而不是它的哪個類。

       必須為遠程對象定義構件器,即使只準備定義一個默認構件器,用它調用基礎類構件器。必須把它明確地編寫出來,因為它必須“擲”出RemoteException違例。

      下面列出遠程接口PerfectTime的事實過程:他代表精確計時服務

    //PerfectTime.java

    //The implementation of the PerfectTime remote object

    package rmi.sample.server;

    import java.net.*;
    import java.rmi.*;
    import java.rmi.registry.*;
    import java.rmi.server.*;
    public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI {
    //默認構件器,也要“擲”出RemoteException違例。 
        public PerfectTime() throws RemoteException { 
            super(); 
        }

    public long getPerfectTime() throws RemoteException { 
        return System.currentTimeMillis();
    }

    public static void main(String[] args) {
    /*創建和安裝一個安全管理器,令其支持RMI.作為Java開發包的一部分,適用于RMI唯一一個是RMISecurityManager.*/ 
    //    System.setSecurityManager(new RMISecurityManager());

        try { 
       /*創建遠程對象的一個或多個實例,下面是PerfectTime對象*/ 
            PerfectTime pt = new PerfectTime(); 
       /*向RMI遠程對象注冊表注冊至少一個遠程對象。一個遠程對象擁有的方法即可生成指向其他遠程對象的句柄,這樣,客戶到注冊表里訪問一次,得到第一個遠程對象即可.*/ 
            Naming.bind("PerfectTime", pt); 
            System.out.println("Ready to do Time"); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        }
    }
    }

    編譯PerfectTime.java,生成PerfectTime.class(rmi.sample.server是包,編譯時注意路徑)
    javac rmi.sample.server.PerfectTime.java

    三、創建根和干:

      創建RemoteObject的主干和框架。要完成這個工作可使用rmic編譯器,rmic編譯器生成遠程對象的存根和骨架。存根(Stub)是遠程對象在客戶端的代理,它將RMI調用傳遞給服務器端的骨架(Skeleton),后者負責將該調用傳遞給實際的遠程方法輸入如下:

    rmic rmi.sample.server.PerfectTime

     執行這個命令,

    rmic成功運行,rmi.sample.server目錄里就會多出兩個新類:

    PerfectTime_Stub.class
    PerfectTime_Skel.class

    它們分別對應的是根(stub)和骨架(skeleton).

    四、使用遠程對象:

    RMI全部的宗旨就是可能簡化遠程接口對象的使用。我們客戶程序中要做的唯一一件額外事情是查找從服務器取回遠程接口。下面就是編寫的Java程序:將消息發給對象:

    //DisplayPerfectTime.java
    //Users remote object PerfectTime

    package rmi.sample.client;
    import java.rmi.*;
    import java.rmi.registry.*;
    public class DisplayPerfectTime {
    /*** DisplayPerfectTime 構造子注解。*/
    public DisplayPerfectTime() { 
        super();
    }

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

    編譯DisplayPerfectTime.java.
    javac rmi.sample.client.DisplayPerfectTime.java

    五、啟動注冊并運行代碼:

    在運行PerfectTime類和DisplayPectTime類之前,用戶必須首先在將要宿主PerfectTime的計算機上啟動RMI注冊(Registry)程序,即使將要運行PerfectTime的計算機與運行DisplayPerfectTime的是同一臺機器,這一步也是必須的。注冊表服務器的名字是rmiregistry.在32位Windows環境中,可使用: start rmiregistry 令其在后臺運行。然后分別開兩個不同的進程運行Server端和Client端:啟動注冊表服務器:

    start rmiregistry

    綁定PerfectTime到注冊,運行服務端程序:在Windows下,輸入下列命令,在后臺啟動PerfectTime程序:

    java rmi.sample.server.PerfectTime

    Ready to do Time

    運行客戶端程序:如下

    G:\RMI>java rmi.sample.client.DisplayPerfectTime

    PerfectTime:961722589649
    PerfectTime:961722589669
    PerfectTime:961722589679
    PerfectTime:961722589679
    PerfectTime:961722589689
    PerfectTime:961722589689
    PerfectTime:961722589689
    PerfectTime:961722589699
    PerfectTime:961722589699
    PerfectTime:961722589699

    RMI程序要注意以下幾點:
    1,rmiregistry必須要能夠找到stub,skeleton
    2,若RMI涉及到Socket讀寫,必須自己寫一個Java策略文件。

    posted on 2006-02-25 11:11 春雷的博客 閱讀(184) 評論(0)  編輯  收藏 所屬分類: java technology


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲国产精品嫩草影院| 亚洲最大黄色网址| 亚洲熟妇久久精品| 亚洲精品乱码久久久久久蜜桃图片| 最近中文字幕无免费| 亚洲午夜在线电影| 99精品免费观看| 国产乱子影视频上线免费观看| 亚洲精品蜜夜内射| 国产午夜免费福利红片| 看免费毛片天天看| 最好看的中文字幕2019免费| 亚洲制服中文字幕第一区| 精品无码无人网站免费视频| 亚洲国产成人久久| 精品少妇人妻AV免费久久洗澡| 亚洲国产成人片在线观看 | 四虎永久免费网站免费观看| 亚洲AV香蕉一区区二区三区| 免费人成视频在线观看网站| 亚洲欧洲自拍拍偷综合| a级毛片无码免费真人久久| 日韩免费视频网站| 一区二区三区亚洲| 一二三四视频在线观看中文版免费| 久久亚洲精品国产精品黑人| 边摸边吃奶边做爽免费视频99| 国产国拍亚洲精品福利| 国产成人AV片无码免费| 亚洲综合伊人制服丝袜美腿| 国产亚洲精品免费| 香港a毛片免费观看| 亚洲av无码一区二区三区不卡 | 亚洲综合激情另类小说区| 希望影院高清免费观看视频| 久久亚洲精品中文字幕三区| 免费大片黄在线观看yw| 麻豆亚洲AV成人无码久久精品| 亚洲精品无码久久久久sm| 在线视频观看免费视频18| 一级一级一级毛片免费毛片|