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

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

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

    無為

    無為則可為,無為則至深!

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks
    第 8 章   

    本章包含 rmic stub 編譯器生成的 stub 和 skleton 所用的接口和類。 

    主題:  
    RemoteStub 類  
    RemoteCall 接口  
    RemoteRef 接口  
    ServerRef 接口  
    Skeleton 接口  
    Operation 類  

    8.1 RemoteStub 類  
    java.rmi.server.RemoteStub 類是遠程對象 stub 的通用超類。stub 對象是一 
    種代理,它支持的遠程接口集與遠程對象的實際實現所定義的完全相同。 

    package java.rmi.server; 
    public abstract class RemoteStub extends java.rmi.RemoteObject

        protected RemoteStub(); 
        protected RemoteStub(RemoteRef ref); 
        protected static void setRef(RemoteStub stub, RemoteRef ref); 



    RemoteStub 的第一個構造函數將創建帶有空遠程引用的 stub。第二個構造函數 
    將創建帶有給定遠程引用 ref 的 stub。 

    JDK1.2 中不鼓勵使用(且不支持)setRef 方法。 

    8.1.1 遠程對象與 stub 類的類型等價性  
    客戶機可與 stub(代理)對象進行交互,該 stub 的遠程接口集與遠程對象類所 
    定義的完全相同。由于 stub 類是由實現一個或多個遠程接口的實現類精華所生 
    成的,因此 stub 類不包括類層次(組成對象的類型圖)的非遠程部分。例如, 
    如果 C 擴展 B 而 B 擴展 A,但只有 B 實現遠程接口,則 stub 將由 B 生成, 
    而非 C。 

    由于 stub 實現與遠程對象類相同的遠程接口集,因此從 Java 系統的角度看, 
    stub 擁有與服務器對象類型圖的遠程部分相同的類型。這樣,客戶機即可利用內 
    置 Java 操作來檢查遠程對象的類型,同時也可從一個遠程接口向另一遠程接口 
    進行強制類型轉換。 

    stub 是用 rmic 編譯器生成的。 
    8.1.2 聲明為終態的對象方法的語義  
    以下方法在 java.lang.Object 類中被聲明為終態 final,因此不能被任意實現 
    所覆蓋: 

    getClass  
    notify  
    notifyAll  
    wait  
    getClass 的缺省實現適用于所有 Java 對象(本地或遠程);對于遠程對象,該 
    方法不需要專門的實現。getClass 方法在遠程 stub 上使用時,它報告由 rmic 
     生成的 stub 對象的確切類型。注意,stub 類型僅反映遠程對象實現的遠程接 
    口,而非本地接口。 

    java.lang.Object 的 wait 和 notify 方法將處理 Java 語言線程模型上下文中 
    的等待和通知。雖然對遠程 stub 使用這些方法不會違反 Java 線程模型,但這 
    些方法的語義將與用于本地 Java 韻笫鋇撓鏌宀煌S繞洌褂謎廡┓椒ㄊ彼?nbsp;
    操作的將是遠程對象的客戶機本地引用 (stub),而不是遠程站點的實際對象。 

    8.2 RemoteCall 接口  
    RemoteCall 是遠程對象的 stub 和 skeleton 所用的抽象接口,用來執行對遠程 
    對象的調用。 

    ---------------------------------------------------------------------- 
    ---------- 

    注意 - JDK 1.2 中不鼓勵使用 RemoteCall 接口。JDK 1.2 stub 協議也已不再 
    使用此接口。現在,stub 在 JDK 1.2 中使用新的 invoke 方法,該方法不需要 
    將 RemoteCall 作為參數。  


    ---------------------------------------------------------------------- 
    ---------- 

    package java.rmi.server; 
    import java.io.*; 

    public interface RemoteCall
    {
        ObjectOutput getOutputStream() throws IOException; 
        void releaseOutputStream() throws IOException; 
        ObjectInput getInputStream() throws IOException; 
        void releaseInputStream() throws IOException; 
        ObjectOutput getResultStream(boolean success) 
            throws IOException, StreamCorruptedException; 
        void executeCall() throws Exception; 
        void done() throws IOException; 



    方法 getOutputStream 返回輸出流。stub 將把參數編組到其中,或者 skeleton
    將把結果編組到其中。 

    方法 releaseOutputStream 釋放輸出流。在某些傳輸中,這將導致釋放流。 

    方法 getInputStream 返回 InputStream。stub 從中解編結果,或者 skeleton 
     從中解編參數。 

    方法 releaseInputStream 釋放輸入流。這將允許某些傳輸提前釋放連接的輸入 
    端。 

    方法 getResultStream 返回輸出流(寫完與調用成功有關的標題信息后)。每次 
    遠程調用將只能獲得一次結果流。如果 success 為真,則要編組的結果屬于正常 
    返回;否則結果為異常。如果已獲得該遠程調用的結果流,則拋出
    StreamCorruptedException。 

    方法 executeCall 盡其所能執行調用。 

    方法 done 允許完成遠程調用后進行清除。 
    .3 RemoteRef 接口  
    接口 RemoteRef 表示遠程對象的句柄。每個 stub 均包含 RemoteRef 的一個實 
    例,其中包含引用的具體表示。該遠程引用將用來在其代表的遠程對象上執行遠 
    程調用。 

    package java.rmi.server; 

    public interface RemoteRef extends java.io.Externalizable

        Object invoke(Remote obj,
                      java.lang.reflect.Method method, 
                      Object[] params, 
                      long opnum) 
            throws Exception; 
        
        RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum, long hash)
            throws RemoteException; 
        void invoke(RemoteCall call) throws Exception; 
        void done(RemoteCall call) throws RemoteException; 
        String getRefClass(java.io.ObjectOutput out); 
        int remoteHashCode(); 
        boolean remoteEquals(RemoteRef obj); 
        String remoteToString(); 


    第一個 invoke 方法將方法調用代理給 stub (obj) 的遠程引用,并允許引用負 
    責建立對遠程主機的連接,將 method 和參數 params 的一些表示進行編組,然 
    后使用方法調用與遠程主機進行通訊。該方法將返回駐留在遠程主機上的遠程對 
    象的方法調用結果,或者在調用失敗時拋出 RemoteException,而在遠程調用拋 
    出異常時則拋出應用程序級異常。注意,操作號 opnum 表示一散列方法簽名,可 
    以用來對要傳輸的方法進行編碼。 

    opnum 的方法散列是一個 64 位(長)整數,是根據美國國家標準技術局 (NIST 
    ) 的安全散列算法 (SHA-1),用字節流消息摘要的前兩個 32 位值計算而來的。 
    字節流包含由遠程方法名后跟其方法描述符組成的字符串的 UTF 編碼(有關方法 
    描述符的說明,參見 Java 虛擬機規范的第 4.3.3 節)。散列值將從 SHA-1 散 
    列的第一個和第二個 32 位值得到。 

    long hash = sha[1] << 32 + sha[0] 



    ---------------------------------------------------------------------- 
    ---------- 

    注意 - JDK 1.2 中不鼓勵使用 newCall、invoke 和 done 方法。rmic 用 JDK  
    1.2 stub 協議版本生成的 stub 不再使用這些方法。由 newCall、invoke 和 d 
    one 組成的調用序列已被新的 invoke 方法所替換,該新方法將 Method 對象作 
    為一個參數。  


    ---------------------------------------------------------------------- 
    ---------- 

    方法 newCall 將為遠程對象 obj 上的新遠程方法調用創建相應的調用對象。操 
    作數組 op 包含遠程對象上的可用操作。操作號 opnum 是對操作數組的索引,它 
    指定該遠程調用的特定操作。 傳遞操作數組和索引可使 stub 生成器能分派操作 
    索引并進行解釋。遠程引用可能需要操作說明以在調用中進行編碼。 

    方法 invoke 負責執行遠程調用。invoke 將產生能順利通過而不被 stub 捕獲的 
    “用戶”異常。如果在遠程調用過程中產生異常,則 invoke 應注意在產生“用 
    戶異常”或 RemoteException 之前清除連接。 

    方法 done 允許遠程引用清除(或重新使用)連接。只有當 invoke 調用已成功 
    地(非異常)返回 stub 時,才應調用 done。 

    方法 getRefClass 返回將被序列化到流 out 上的引用類型的非包限定的類全名 
    。 

    方法 remoteHashCode 返回遠程對象的散列碼。兩個引用相同遠程對象的遠程對 
    象 stub 將有相同的散列碼(以支持在散列表中將遠程對象作為鍵值)。Remote 
    Object 將把對其 hashCode 方法的調用轉發給遠程引用的 remoteHashCode 方法 
    。 

    方法 remoteEquals 比較兩個遠程對象的等價性。如果兩個遠程對象引用相同的 
    遠程對象,即認為它們等價。例如,如果兩個 stub 引用相同的遠程對象,則認 
    為它們等價。 RemoteObject 將把對其 equals 方法的調用轉發給遠程引用的 r 
    emoteEquals 方法。  

    方法 remoteToString 返回表示該遠程對象的引用的 String。 

    8.4 ServerRef 接口  
    接口 ServerRef 表示遠程對象實現的服務器端句柄。 

    package java.rmi.server; 

    public interface ServerRef extends RemoteRef { 

    RemoteStub exportObject(java.rmi.Remote obj, Object data) 
    throws java.rmi.RemoteException; 

    String getClientHost() throws ServerNotActiveException; 



    方法 exportObject 將為所提供的 Remote 對象實現 obj 查找或創建客戶機 st 
    ub 對象。參數 data 包含導出對象所需的信息(如端口號)。 

    方法 getClientHost 返回當前客戶機的主機名。當它被當前正在處理遠程對象調 
    用的線程調用時,將返回執行此調用的客戶機主機名。如果當前某一遠程方法調 
    用未處于服務狀態,則調用 ServerNotActiveException。 

    8.5 Skeleton 接口  
    接口 Skeleton 僅能由 rmic 編譯器所生成 skeleton 的實現。遠程對象的 ske 
    leton 是服務器端的實體,它將為實際遠程對象實現分配調用。 


    ---------------------------------------------------------------------- 
    ---------- 

    注意 - JDK1.2 中不鼓勵使用 Skeleton 接口。每個由 rmic stub 編譯器生成的 
     1.1(以及在 1.2 中由缺省 rmic -vcompat 生成的兼容 1.1 的 skeleton)sk 
    eleton 類均實現該接口。JDK1.2 兼容版本中分配遠程方法調用將不再需要 ske 
    leton。要生成兼容 JDK1.2 或更高版本的 stub,請使用帶有選項 -v1.2 的命令 
     rmic。  


    ---------------------------------------------------------------------- 
    ---------- 

    package java.rmi.server; 

    public interface Skeleton


        void dispatch(Remote obj, RemoteCall call, int opnum, long hash) 
            throws Exception; 
        Operation[] getOperations(); 



    dispatch 方法將解編 call 對象中獲得的輸入流中的參數,調用實際遠程對象實 
    現 obj 上的方法(由操作號 opnum 表示),然后將返回值進行編組。如果在調 
    用過程中發生異常,則拋出異常。 

    getOperations 方法返回包含遠程對象方法的操作描述符的數組。 
    8.6 Operation 類  
    類 Operation 包含對遠程對象 Java 方法的說明。 


    ---------------------------------------------------------------------- 
    ---------- 

    注意 - JDK 1.2 中不鼓勵使用 Operation 接口。JDK 1.2 stub 協議不再使用原 
    有的、以 Operation 作為參數的 RemoteRef.invoke 方法。stub 在 JDK 1.2 中 
    使用了新的 invoke 方法,它不再需要將 Operation 作為參數。  


    ---------------------------------------------------------------------- 
    ---------- 

    package java.rmi.server; 

    public class Operation


        public Operation(String op); 

        public String getOperation(); 

        public String toString(); 



    構造 Operation 對象時通常帶有方法簽名。 

    方法 getOperation 返回操作描述符的內容(其初始化時使用的值)。 

    方法 toString 也返回操作描述符的字符串表示(通常為方法簽名)。 


    凡是有該標志的文章,都是該blog博主Caoer(草兒)原創,凡是索引、收藏
    、轉載請注明來處和原文作者。非常感謝。

    posted on 2005-12-14 13:16 草兒 閱讀(173) 評論(0)  編輯  收藏 所屬分類: Java編程經驗談
    主站蜘蛛池模板: 国产AV无码专区亚洲A∨毛片| 国产福利免费观看| 亚洲日韩精品无码一区二区三区| 亚洲国产午夜精品理论片在线播放| 国产免费毛不卡片| 亚洲色欲色欲www在线播放| 在线免费观看一区二区三区| 亚洲hairy多毛pics大全| 又黄又爽无遮挡免费视频| 爱情岛论坛免费视频| 精品亚洲视频在线观看| 大地资源在线资源免费观看| 亚洲成AV人片在线观看无码| 8x网站免费入口在线观看| 亚洲深深色噜噜狠狠网站| 日本一道本高清免费| 特黄特色的大片观看免费视频| JLZZJLZZ亚洲乱熟无码| 成人影片一区免费观看| 亚洲人成在线播放网站岛国| 国产卡二卡三卡四卡免费网址| 在线观看亚洲AV日韩A∨| 亚洲AV无码成人精品区大在线| 在线免费视频你懂的| 久久夜色精品国产噜噜噜亚洲AV | 亚洲av无码片区一区二区三区| 免费国产作爱视频网站| 国产精品亚洲а∨无码播放不卡| 亚洲一本大道无码av天堂| 男人j进入女人j内部免费网站| 亚洲国产精品yw在线观看| 国产成人免费a在线视频app| 99re8这里有精品热视频免费| 亚洲视频免费在线看| 国产精品免费视频一区| 91精品成人免费国产| 亚洲一区二区影视| 亚洲性久久久影院| 美女被免费喷白浆视频| 国产福利免费视频| 亚洲另类小说图片|