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

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

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

    tangbao

    導(dǎo)航

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

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    url

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    RMI規(guī)范

    RMI規(guī)范--第二章

    Java 分布式對象模型

    2.1 分布式對象應(yīng)用程序
    RMI 應(yīng)用程序通常包括兩個獨(dú)立的程序:服務(wù)器程序和客戶機(jī)程序。典型的服務(wù)
    器應(yīng)用程序?qū)?chuàng)建多個遠(yuǎn)程對象,使這些遠(yuǎn)程對象能夠被引用,然后等待客戶機(jī)
    調(diào)用那些遠(yuǎn)程對象上的方法。而典型的客戶機(jī)程序則從服務(wù)器中得到一個或多個
    遠(yuǎn)程對象的引用,然后調(diào)用遠(yuǎn)程對象的方法。RMI 為服務(wù)器和客戶機(jī)進(jìn)行通訊
    和信息傳遞提供了一種機(jī)制。這樣的應(yīng)用程序有時(shí)被稱為分布式對象應(yīng)用程序。

    分布式對象應(yīng)用程序需要:

    定位遠(yuǎn)程對象
    應(yīng)用程序可使用兩種機(jī)制中的一種得到對遠(yuǎn)程對象的引用。它既可用 RMI 的簡
    單命名工具 rmiregistry 來注冊它的遠(yuǎn)程對象;也可將遠(yuǎn)程對象引用作為常規(guī)
    操作的一部分來進(jìn)行傳遞和返回。
    與遠(yuǎn)程對象通訊
    遠(yuǎn)程對象間通訊的細(xì)節(jié)由 RMI 處理;對于程序員來說,遠(yuǎn)程通訊看起來就象標(biāo)
    準(zhǔn)的 Java 方法調(diào)用。給作為參數(shù)或返回值傳遞的對象加載類字節(jié)碼因?yàn)?RMI
    允許調(diào)用程序?qū)⒓?Java 對象傳給遠(yuǎn)程對象,所以 RMI 將提供必要的機(jī)制,
    既可以加載對象的代碼又可以傳輸對象的數(shù)據(jù)。
    服務(wù)器調(diào)用注冊服務(wù)程序以使名字與遠(yuǎn)程對象相關(guān)聯(lián)。客戶機(jī)在服務(wù)器注冊服務(wù)
    程序中用遠(yuǎn)程對象的名字查找該遠(yuǎn)程對象,然后調(diào)用它的方法。RMI 能用 Java
    系統(tǒng)支持的任何 URL 協(xié)議(例如 HTTP、FTP、file 等)加載類字節(jié)碼。


    2.2 術(shù)語的定義
    在 Java 分布式對象模型中,remote object 是這樣一種對象:它的方法可以
    從其它 Java 虛擬機(jī)(可能在不同的主機(jī)上)中調(diào)用。該類型的對象由一種或
    多種 remote interfaces(它是聲明遠(yuǎn)程對象方法的 Java 接口)描述。
    遠(yuǎn)程方法調(diào)用 (RMI) 就是調(diào)用遠(yuǎn)程對象上遠(yuǎn)程接口的方法的動作。更為重要的
    是,遠(yuǎn)程對象的方法調(diào)用與本地對象的方法調(diào)用語法相同。


    2.3 分布式和非分布式模型的比較
    Java 分布式對象模型在以下幾方面與 Java 對象模型相似:

    遠(yuǎn)程對象的引用在任一種方法調(diào)用中(本地或遠(yuǎn)程)都能以參數(shù)形式傳遞或以結(jié)
    果形式返回。
    遠(yuǎn)程對象可以被強(qiáng)制轉(zhuǎn)換成任何遠(yuǎn)程界面,只要該界面為使用內(nèi)置 Java 語法
    進(jìn)行強(qiáng)制類型轉(zhuǎn)換的實(shí)現(xiàn)所支持。
    內(nèi)置 Java 操作符 instanceof 可用來測試遠(yuǎn)程對象所支持的遠(yuǎn)程接口。
    Java 分布式對象模型在以下幾方面與 Java 對象模型不同:
    遠(yuǎn)程對象的客戶機(jī)與遠(yuǎn)程接口發(fā)生交互,而從不與這些接口的實(shí)現(xiàn)類交互。
    遠(yuǎn)程方法的非遠(yuǎn)程參數(shù)和返回結(jié)果是通過復(fù)制而非引用的方式傳遞的。這是因?yàn)?
    對象的引用只在單個虛擬機(jī)中才有用。

    遠(yuǎn)程對象以引用的方式進(jìn)行傳遞,而不是復(fù)制實(shí)際的遠(yuǎn)程實(shí)現(xiàn)。
    某些 java.lang.Object 類定義的方法的語義專用于遠(yuǎn)程對象。
    因?yàn)檎{(diào)用遠(yuǎn)程對象的失敗模式本來就比調(diào)用本地對象的失敗模式復(fù)雜,所以客戶
    機(jī)必須處理遠(yuǎn)程方法調(diào)用期間發(fā)生的額外異常。

    2.4 RMI 接口和類概述
    2.4.1 java.rmi.Remote 接口
    在 RMI 中,遠(yuǎn)程接口是聲明了可從遠(yuǎn)程 Java 虛擬機(jī)中調(diào)用的方法集。遠(yuǎn)程接
    口必須滿足下列要求:

    遠(yuǎn)程接口至少必須直接或間接擴(kuò)展 java.rmi.Remote 接口。
    遠(yuǎn)程接口中的方法聲明必須滿足下列遠(yuǎn)程方法聲明的要求:
    遠(yuǎn)程方法聲明在其 throws 子句中除了要包含與應(yīng)用程序有關(guān)的異常(注意與
    應(yīng)用程序有關(guān)的異常無需擴(kuò)展 java.rmi.RemoteException )之外,還必須包
    括 java.rmi.RemoteException 異常(或它的超類,例如
    java.io.IOException 或 java.lang.Exception )。
    遠(yuǎn)程方法聲明中,作為參數(shù)或返回值聲明的(在參數(shù)表中直接聲明或嵌入到參數(shù)

    的非遠(yuǎn)程對象中)遠(yuǎn)程對象必須聲明為遠(yuǎn)程接口,而非該接口的實(shí)現(xiàn)類。
    java.rmi.Remote 接口是一個不定義方法的標(biāo)記接口:

    public interface Remote


    遠(yuǎn)程接口必須至少擴(kuò)展 java.rmi.Remote 接口(或其它擴(kuò)展
    java.rmi.Remote 的遠(yuǎn)程接口)。然而,遠(yuǎn)程接口在下列情況中可以擴(kuò)展非遠(yuǎn)
    程接口:

    遠(yuǎn)程接口也可擴(kuò)展其它非遠(yuǎn)程接口,只要被擴(kuò)展接口的所有方法(如果有)滿足
    遠(yuǎn)程方法聲明的要求。
    例如,下面的接口 BankAccount 即為訪問銀行帳戶定義了一個遠(yuǎn)程接口。它包
    含往帳戶存款、使帳戶收支平衡和從帳戶取款的遠(yuǎn)程方法:

    public interface BankAccount extends java.rmi.Remote
    {
    public void deposit(float amount)
    throws java.rmi.RemoteException;
    public void withdraw(float amount)
    throws OverdrawnException, java.rmi.RemoteException;
    public float getBalance()
    throws java.rmi.RemoteException;
    }


    下例說明了有效的遠(yuǎn)程接口 Beta。它擴(kuò)展非遠(yuǎn)程接口 Alpha(有遠(yuǎn)程方法)和

    接口 java.rmi.Remote:

    public interface Alpha
    {
    public final String okay = "constants are okay too";
    public Object foo(Object obj)
    throws java.rmi.RemoteException;
    public void bar() throws java.io.IOException;
    public int baz() throws java.lang.Exception;
    }


    public interface Beta extends Alpha, java.rmi.Remote {
    public void ping() throws java.rmi.RemoteException;
    }

    2.4.2 RemoteException 類
    java.rmi.RemoteException 類是在遠(yuǎn)程方法調(diào)用期間由 RMI 運(yùn)行時(shí)所拋出
    的異常的超類。為確保使用 RMI 系統(tǒng)的應(yīng)用程序的健壯性,遠(yuǎn)程接口中聲明的
    遠(yuǎn)程方法在其 throws 子句中必須指定 java.rmi.RemoteException(或它的
    超類,例如 java.io.IOException 或 java.lang.Exception)。

    當(dāng)遠(yuǎn)程方法調(diào)用由于某種原因失敗時(shí),將拋出 java.rmi.RemoteException 異
    常。遠(yuǎn)程方法調(diào)用失敗的原因包括:

    通訊失敗(遠(yuǎn)程服務(wù)器不可達(dá)或拒絕連接;連接被服務(wù)器關(guān)閉等。)
    參數(shù)或返回值傳輸或讀取時(shí)失敗
    協(xié)議錯誤
    RemoteException 類是一個已檢驗(yàn)的異常(必須由遠(yuǎn)程方法的調(diào)用程序處理并
    經(jīng)編譯器檢驗(yàn)的異常),而不是 RuntimeException。

    2.4.3 RemoteObject 類及其子類
    RMI 服務(wù)器函數(shù)由 java.rmi.server.RemoteObject 及其子類
    java.rmi.server.RemoteServer、java.rmi.server.UnicastRemoteObject
    和 java.rmi.activation.Activatable 提供。

    java.rmi.server.RemoteObject 為對遠(yuǎn)程對象敏感的 java.lang.Object
    方法、hashCode、 equals 和 toString 提供實(shí)現(xiàn)。
    創(chuàng)建遠(yuǎn)程對象并將其導(dǎo)出(使它們可為遠(yuǎn)程客戶機(jī)利用)所需的方法由類
    UnicastRemoteObject 和 Activatable 提供。子類可以識別遠(yuǎn)程引用的語義,

    例如服務(wù)器是簡單的遠(yuǎn)程對象還是可激活的遠(yuǎn)程對象(調(diào)用時(shí)將執(zhí)行的遠(yuǎn)程對象)。
    java.rmi.server.UnicastRemoteObject 類定義了單體(單路傳送)遠(yuǎn)程對
    象,其引用只有在服務(wù)器進(jìn)程活著時(shí)才有效。
    類 java.rmi.activation.Activatable 是抽象類,它定義的 activatable
    遠(yuǎn)程對象在其遠(yuǎn)程方法被調(diào)用時(shí)開始執(zhí)行并在必要時(shí)自己關(guān)閉。

    2.5 實(shí)現(xiàn)遠(yuǎn)程接口
    實(shí)現(xiàn)遠(yuǎn)程接口的類的一般規(guī)則如下:

    該類通常擴(kuò)展 java.rmi.server.UnicastRemoteObject,因而將繼承類
    java.rmi.server.RemoteObject 和java.rmi.server.RemoteServer 提供
    的遠(yuǎn)程行為。
    該類能實(shí)現(xiàn)任意多的遠(yuǎn)程接口。
    該類能擴(kuò)展其它遠(yuǎn)程實(shí)現(xiàn)類。
    該類能定義遠(yuǎn)程接口中不出現(xiàn)的方法,但這些方法只能在本地使用而不能在遠(yuǎn)程

    使用。
    例如,下面的類 BankAcctImpl 實(shí)現(xiàn) BankAccount 遠(yuǎn)程接口并擴(kuò)展
    java.rmi.server.UnicastRemoteObject 類:

    package mypackage;

    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;

    public class BankAccountImpl extends UnicastRemoteObject implements
    BankAccount

    {
    private float balance = 0.0;

    public BankAccountImpl(float initialBalance)
    throws RemoteException
    {
    balance = initialBalance;
    }

    public void deposit(float amount) throws RemoteException
    {
    ...
    }

    public void withdraw(float amount) throws OverdrawnException,
    RemoteException
    {
    ...
    }

    public float getBalance() throws RemoteException
    {
    ...
    }
    }


    注意:必要時(shí),實(shí)現(xiàn)遠(yuǎn)程接口的類能擴(kuò)展除
    java.rmi.server.UnicastRemoteObject 類以外的其它一些類。但實(shí)現(xiàn)類此
    時(shí)必須承擔(dān)起一定的責(zé)任,即導(dǎo)出對象(由 UnicastRemoteObject 構(gòu)造函數(shù)
    負(fù)責(zé))和實(shí)現(xiàn)從 java.lang.Object 類繼承的 hashCode、 equals 和
    toString 方法的正確遠(yuǎn)程語義(如果需要)。


    2.6 遠(yuǎn)程方法調(diào)用中的參數(shù)傳遞
    傳給遠(yuǎn)程對象的參數(shù)或源于它的返回值可以是任意可序列化的 Java 對象。這包

    括 Java 基本類型, 遠(yuǎn)程?Java 對象和實(shí)現(xiàn) java.io.Serializable 接口的
    非遠(yuǎn)程 Java 對象。有關(guān)如何使類序列化的詳細(xì)信息,參見 Java“對象序列化

    規(guī)范”。本地得不到的作為參數(shù)或返回值的類,可通過 RMI 系統(tǒng)進(jìn)行動態(tài)下載。

    有關(guān) RMI 讀取參數(shù)、返回值和異常時(shí)如何下載參數(shù)和返回值類的詳細(xì)信息,參

    見“動態(tài)類加載”(3.4)一節(jié)。

    2.6.1 傳遞非遠(yuǎn)程對象
    非遠(yuǎn)程對象將作為遠(yuǎn)程方法調(diào)用的參數(shù)傳遞或作為遠(yuǎn)程方法調(diào)用的結(jié)果返回時(shí),
    是通過復(fù)制傳遞的;也就是使用 Java 對象序列化機(jī)制將該對象序列化。
    因此,在遠(yuǎn)程對象調(diào)用過程中,當(dāng)非遠(yuǎn)程對象作為參數(shù)或返回值傳遞時(shí),非遠(yuǎn)程
    對象的內(nèi)容在調(diào)用遠(yuǎn)程對象之前將被復(fù)制。
    從遠(yuǎn)程方法調(diào)用返回非遠(yuǎn)程對象時(shí),將在調(diào)用的虛擬機(jī)中創(chuàng)建新對象。

    2.6.2 傳遞遠(yuǎn)程對象
    當(dāng)將遠(yuǎn)程對象作為遠(yuǎn)程方法調(diào)用的參數(shù)或返回值傳遞時(shí),遠(yuǎn)程對象的 stub 程序
    即被傳遞出去。作為參數(shù)傳遞的遠(yuǎn)程對象僅能實(shí)現(xiàn)遠(yuǎn)程接口。

    2.6.3 引用的完整性
    如果一個對象的兩個引用在單個遠(yuǎn)程方法調(diào)用中以參數(shù)形式(或返回值形式)從
    一個虛擬機(jī)傳到另一個虛擬機(jī)中,并且它們在發(fā)送虛擬機(jī)中指向同一對象,則兩
    個引用在接收虛擬機(jī)中將指向該對象的同一副本。進(jìn)一步說就是:在單個遠(yuǎn)程方
    法調(diào)用中,RMI 系統(tǒng)將在作為調(diào)用參數(shù)或返回值傳遞的對象中保持引用的完整性

    2.6.4 類注解
    當(dāng)對象在遠(yuǎn)程調(diào)用中被從一個虛擬機(jī)發(fā)送到另一個虛擬機(jī)中時(shí),RMI 系統(tǒng)在調(diào)用
    流中用類的信息 (URL) 給類描述符加注解,以便該類能在接收器上加載。在遠(yuǎn)
    程方法調(diào)用期間,調(diào)用可隨時(shí)下載類。

    2.6.5 參數(shù)傳輸
    為將 RMI 調(diào)用的參數(shù)序列化到遠(yuǎn)程調(diào)用的目的文件里,需要將該參數(shù)寫入作為
    java.io.ObjectOutputStream 類的子類的流中。ObjectOutputStream 子類
    將覆蓋 replaceObject 方法,目的是用其相應(yīng)的 stub 類取代每個遠(yuǎn)程對象。
    對象參數(shù)將通過 ObjectOutputStream 的 writeObject 方法寫入流中。而
    ObjectOutputStream 則通過 writeObject 方法為每個寫入流中的對象(包
    含所寫對象所引用的對象)調(diào)用 replaceObject 方法。RMIObjectOutputStream
    子類的 replaceObject 方法返回下列值:
    如果傳給 replaceObject 的對象是 java.rmi.Remote 的實(shí)例,則返回遠(yuǎn)程對
    象的 stub 程序。遠(yuǎn)程對象的 stub 程序通過對
    java.rmi.server.RemoteObject.toStub
    方法的調(diào)用而獲得。
    如果傳給 replaceObject 的對象不是 java.rmi.Remote 的實(shí)例,則只返回
    該對象。
    RMI 的 ObjectOutputStream 子類也實(shí)現(xiàn) annotateClass 方法,該方法用類
    的位置注解調(diào)用流以便能在接收器中下載該類。有關(guān)如何使用 annotateClass
    的詳細(xì)信息,參見“動態(tài)類加載”一節(jié)。
    因?yàn)閰?shù)只寫入一個 ObjectOutputStream,所以指向調(diào)用程序同一對象的引用
    將在接收器那里指向該對象的同一副本。在接收器上,參數(shù)將被單個
    ObjectInputStream 所讀取。

    用于寫對象的 ObjectOutputStream(類似的還有用于讀對象的

    ObjectInputStream )的所有其它缺省行為將保留在參數(shù)傳遞中。例如,寫對
    象時(shí)對 writeReplace 的調(diào)用及讀對象時(shí)對 readResolve 的調(diào)用就是由 RMI
    的參數(shù)編組與解編流完成的。

    與上述 RMI 參數(shù)傳遞方式類似,返回值(或異常)將被寫入
    ObjectOutputStream
    的子類并和參數(shù)傳輸?shù)奶娲袨橄嗤?


    2.7 定位遠(yuǎn)程對象
    我們專門提供了一種簡單的引導(dǎo)名字服務(wù)器,用于存儲對遠(yuǎn)程對象的已命名引用
    。使用類 java.rmi.Naming 的基于 URL 的方法可以存儲遠(yuǎn)程對象引用。
    客戶機(jī)要調(diào)用遠(yuǎn)程對象的方法,則必須首先得到該對象的引用。對遠(yuǎn)程對象的引
    用通常是在方法調(diào)用中以返回值的形式取得。RMI 系統(tǒng)提供一種簡單的引導(dǎo)名字
    服務(wù)器,通過它得到給定主機(jī)上的遠(yuǎn)程對象。java.rmi.Naming 類提供基于統(tǒng)
    一資源定位符 (URL) 的方法,用來綁定、再綁定、解開和列出位于某一主機(jī)及
    端口上的名字-對象對。

     



    posted on 2007-05-29 15:14 糖包 閱讀(74) 評論(0)  編輯  收藏


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 一本色道久久88亚洲精品综合| 亚洲综合久久成人69| 免费亚洲视频在线观看| 亚洲裸男gv网站| 亚洲AV成人一区二区三区AV| 亚洲乱码一二三四区国产| 日本高清不卡中文字幕免费| 在线观看免费播放av片| 91在线视频免费看| 亚洲精品高清一二区久久| 一级毛片a免费播放王色电影 | 亚洲AV午夜成人片| 亚洲午夜无码毛片av久久京东热| 色窝窝免费一区二区三区| 亚洲 无码 在线 专区| 亚洲娇小性xxxx| 男人j进入女人j内部免费网站| 最近最新中文字幕完整版免费高清 | 中文在线观看国语高清免费| 日本妇人成熟免费中文字幕| 亚洲日韩小电影在线观看| 午夜亚洲国产理论片二级港台二级 | 亚洲精品国产精品乱码不卡√ | 91在线视频免费看| 美女视频黄a视频全免费网站一区| 97视频免费观看2区| 亚洲狠狠爱综合影院婷婷| 在线免费观看h片| 国产精品V亚洲精品V日韩精品| 中文字幕乱码亚洲精品一区| 13一14周岁毛片免费| 亚洲人成网77777色在线播放| 国产a视频精品免费观看| 精品日韩亚洲AV无码| 最近免费中文字幕MV在线视频3| 亚洲精品在线不卡| 免费国产一级特黄久久| 免费人成视频在线观看网站| 亚洲AV色无码乱码在线观看| 亚洲av永久无码精品网站 | 日韩高清免费在线观看|