小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

 螞蟻搬家 2009-03-16
RMI規(guī)范--第二章
Java 分布式對象模型
2.1 分布式對象應用程序
RMI 應用程序通常包括兩個獨立的程序:服務器程序和客戶機程序。典型的服務
器應用程序?qū)?chuàng)建多個遠程對象,使這些遠程對象能夠被引用,然后等待客戶機
調(diào)用那些遠程對象上的方法。而典型的客戶機程序則從服務器中得到一個或多個
遠程對象的引用,然后調(diào)用遠程對象的方法。RMI 為服務器和客戶機進行通訊
和信息傳遞提供了一種機制。這樣的應用程序有時被稱為分布式對象應用程序。
分布式對象應用程序需要:
定位遠程對象
應用程序可使用兩種機制中的一種得到對遠程對象的引用。它既可用 RMI 的簡
單命名工具 rmiregistry 來注冊它的遠程對象;也可將遠程對象引用作為常規(guī)
操作的一部分來進行傳遞和返回。
與遠程對象通訊
遠程對象間通訊的細節(jié)由 RMI 處理;對于程序員來說,遠程通訊看起來就象標
準的 Java 方法調(diào)用。給作為參數(shù)或返回值傳遞的對象加載類字節(jié)碼因為 RMI
允許調(diào)用程序?qū)⒓?Java 對象傳給遠程對象,所以 RMI 將提供必要的機制,
既可以加載對象的代碼又可以傳輸對象的數(shù)據(jù)。
服務器調(diào)用注冊服務程序以使名字與遠程對象相關聯(lián)??蛻魴C在服務器注冊服務
程序中用遠程對象的名字查找該遠程對象,然后調(diào)用它的方法。RMI 能用 Java
系統(tǒng)支持的任何 URL 協(xié)議(例如 HTTP、FTP、file 等)加載類字節(jié)碼。

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

2.3 分布式和非分布式模型的比較
Java 分布式對象模型在以下幾方面與 Java 對象模型相似:
遠程對象的引用在任一種方法調(diào)用中(本地或遠程)都能以參數(shù)形式傳遞或以結(jié)
果形式返回。
遠程對象可以被強制轉(zhuǎn)換成任何遠程界面,只要該界面為使用內(nèi)置 Java 語法
進行強制類型轉(zhuǎn)換的實現(xiàn)所支持。
內(nèi)置 Java 操作符 instanceof 可用來測試遠程對象所支持的遠程接口。
Java 分布式對象模型在以下幾方面與 Java 對象模型不同:
遠程對象的客戶機與遠程接口發(fā)生交互,而從不與這些接口的實現(xiàn)類交互。
遠程方法的非遠程參數(shù)和返回結(jié)果是通過復制而非引用的方式傳遞的。這是因為
對象的引用只在單個虛擬機中才有用。
遠程對象以引用的方式進行傳遞,而不是復制實際的遠程實現(xiàn)。
某些 java.lang.Object 類定義的方法的語義專用于遠程對象。
因為調(diào)用遠程對象的失敗模式本來就比調(diào)用本地對象的失敗模式復雜,所以客戶
機必須處理遠程方法調(diào)用期間發(fā)生的額外異常。
2.4 RMI 接口和類概述
2.4.1 java.rmi.Remote 接口
在 RMI 中,遠程接口是聲明了可從遠程 Java 虛擬機中調(diào)用的方法集。遠程接
口必須滿足下列要求:
遠程接口至少必須直接或間接擴展 java.rmi.Remote 接口。
遠程接口中的方法聲明必須滿足下列遠程方法聲明的要求:
遠程方法聲明在其 throws 子句中除了要包含與應用程序有關的異常(注意與
應用程序有關的異常無需擴展 java.rmi.RemoteException )之外,還必須包
括 java.rmi.RemoteException 異常(或它的超類,例如
java.io.IOException 或 java.lang.Exception )。
遠程方法聲明中,作為參數(shù)或返回值聲明的(在參數(shù)表中直接聲明或嵌入到參數(shù)
的非遠程對象中)遠程對象必須聲明為遠程接口,而非該接口的實現(xiàn)類。
java.rmi.Remote 接口是一個不定義方法的標記接口:
public interface Remote

遠程接口必須至少擴展 java.rmi.Remote 接口(或其它擴展
java.rmi.Remote 的遠程接口)。然而,遠程接口在下列情況中可以擴展非遠
程接口:
遠程接口也可擴展其它非遠程接口,只要被擴展接口的所有方法(如果有)滿足
遠程方法聲明的要求。
例如,下面的接口 BankAccount 即為訪問銀行帳戶定義了一個遠程接口。它包
含往帳戶存款、使帳戶收支平衡和從帳戶取款的遠程方法:
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;
}

下例說明了有效的遠程接口 Beta。它擴展非遠程接口 Alpha(有遠程方法)和
接口 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 類是在遠程方法調(diào)用期間由 RMI 運行時所拋出
的異常的超類。為確保使用 RMI 系統(tǒng)的應用程序的健壯性,遠程接口中聲明的
遠程方法在其 throws 子句中必須指定 java.rmi.RemoteException(或它的
超類,例如 java.io.IOException 或 java.lang.Exception)。
當遠程方法調(diào)用由于某種原因失敗時,將拋出 java.rmi.RemoteException 異
常。遠程方法調(diào)用失敗的原因包括:
通訊失?。ㄟh程服務器不可達或拒絕連接;連接被服務器關閉等。)
參數(shù)或返回值傳輸或讀取時失敗
協(xié)議錯誤
RemoteException 類是一個已檢驗的異常(必須由遠程方法的調(diào)用程序處理并
經(jīng)編譯器檢驗的異常),而不是 RuntimeException。
2.4.3 RemoteObject 類及其子類
RMI 服務器函數(shù)由 java.rmi.server.RemoteObject 及其子類
java.rmi.server.RemoteServer、java.rmi.server.UnicastRemoteObject
和 java.rmi.activation.Activatable 提供。
java.rmi.server.RemoteObject 為對遠程對象敏感的 java.lang.Object
方法、hashCode、 equals 和 toString 提供實現(xiàn)。
創(chuàng)建遠程對象并將其導出(使它們可為遠程客戶機利用)所需的方法由類
UnicastRemoteObject 和 Activatable 提供。子類可以識別遠程引用的語義,
例如服務器是簡單的遠程對象還是可激活的遠程對象(調(diào)用時將執(zhí)行的遠程對象)。
java.rmi.server.UnicastRemoteObject 類定義了單體(單路傳送)遠程對
象,其引用只有在服務器進程活著時才有效。
類 java.rmi.activation.Activatable 是抽象類,它定義的 activatable
遠程對象在其遠程方法被調(diào)用時開始執(zhí)行并在必要時自己關閉。
2.5 實現(xiàn)遠程接口
實現(xiàn)遠程接口的類的一般規(guī)則如下:
該類通常擴展 java.rmi.server.UnicastRemoteObject,因而將繼承類
java.rmi.server.RemoteObject 和java.rmi.server.RemoteServer 提供
的遠程行為。
該類能實現(xiàn)任意多的遠程接口。
該類能擴展其它遠程實現(xiàn)類。
該類能定義遠程接口中不出現(xiàn)的方法,但這些方法只能在本地使用而不能在遠程
使用。
例如,下面的類 BankAcctImpl 實現(xiàn) BankAccount 遠程接口并擴展
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
{
...
}
}

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

2.6 遠程方法調(diào)用中的參數(shù)傳遞
傳給遠程對象的參數(shù)或源于它的返回值可以是任意可序列化的 Java 對象。這包
括 Java 基本類型, 遠程?Java 對象和實現(xiàn) java.io.Serializable 接口的
非遠程 Java 對象。有關如何使類序列化的詳細信息,參見 Java“對象序列化
規(guī)范”。本地得不到的作為參數(shù)或返回值的類,可通過 RMI 系統(tǒng)進行動態(tài)下載。
有關 RMI 讀取參數(shù)、返回值和異常時如何下載參數(shù)和返回值類的詳細信息,參
見“動態(tài)類加載”(3.4)一節(jié)。
2.6.1 傳遞非遠程對象
非遠程對象將作為遠程方法調(diào)用的參數(shù)傳遞或作為遠程方法調(diào)用的結(jié)果返回時,
是通過復制傳遞的;也就是使用 Java 對象序列化機制將該對象序列化。
因此,在遠程對象調(diào)用過程中,當非遠程對象作為參數(shù)或返回值傳遞時,非遠程
對象的內(nèi)容在調(diào)用遠程對象之前將被復制。
從遠程方法調(diào)用返回非遠程對象時,將在調(diào)用的虛擬機中創(chuàng)建新對象。
2.6.2 傳遞遠程對象
當將遠程對象作為遠程方法調(diào)用的參數(shù)或返回值傳遞時,遠程對象的 stub 程序
即被傳遞出去。作為參數(shù)傳遞的遠程對象僅能實現(xiàn)遠程接口。
2.6.3 引用的完整性
如果一個對象的兩個引用在單個遠程方法調(diào)用中以參數(shù)形式(或返回值形式)從
一個虛擬機傳到另一個虛擬機中,并且它們在發(fā)送虛擬機中指向同一對象,則兩
個引用在接收虛擬機中將指向該對象的同一副本。進一步說就是:在單個遠程方
法調(diào)用中,RMI 系統(tǒng)將在作為調(diào)用參數(shù)或返回值傳遞的對象中保持引用的完整性
。
2.6.4 類注解
當對象在遠程調(diào)用中被從一個虛擬機發(fā)送到另一個虛擬機中時,RMI 系統(tǒng)在調(diào)用
流中用類的信息 (URL) 給類描述符加注解,以便該類能在接收器上加載。在遠
程方法調(diào)用期間,調(diào)用可隨時下載類。
2.6.5 參數(shù)傳輸
為將 RMI 調(diào)用的參數(shù)序列化到遠程調(diào)用的目的文件里,需要將該參數(shù)寫入作為
java.io.ObjectOutputStream 類的子類的流中。ObjectOutputStream 子類
將覆蓋 replaceObject 方法,目的是用其相應的 stub 類取代每個遠程對象。
對象參數(shù)將通過 ObjectOutputStream 的 writeObject 方法寫入流中。而
ObjectOutputStream 則通過 writeObject 方法為每個寫入流中的對象(包
含所寫對象所引用的對象)調(diào)用 replaceObject 方法。RMIObjectOutputStream
子類的 replaceObject 方法返回下列值:
如果傳給 replaceObject 的對象是 java.rmi.Remote 的實例,則返回遠程對
象的 stub 程序。遠程對象的 stub 程序通過對
java.rmi.server.RemoteObject.toStub
方法的調(diào)用而獲得。
如果傳給 replaceObject 的對象不是 java.rmi.Remote 的實例,則只返回
該對象。
RMI 的 ObjectOutputStream 子類也實現(xiàn) annotateClass 方法,該方法用類
的位置注解調(diào)用流以便能在接收器中下載該類。有關如何使用 annotateClass
的詳細信息,參見“動態(tài)類加載”一節(jié)。
因為參數(shù)只寫入一個 ObjectOutputStream,所以指向調(diào)用程序同一對象的引用
將在接收器那里指向該對象的同一副本。在接收器上,參數(shù)將被單個
ObjectInputStream 所讀取。
用于寫對象的 ObjectOutputStream(類似的還有用于讀對象的
ObjectInputStream )的所有其它缺省行為將保留在參數(shù)傳遞中。例如,寫對
象時對 writeReplace 的調(diào)用及讀對象時對 readResolve 的調(diào)用就是由 RMI
的參數(shù)編組與解編流完成的。
與上述 RMI 參數(shù)傳遞方式類似,返回值(或異常)將被寫入
ObjectOutputStream
的子類并和參數(shù)傳輸?shù)奶娲袨橄嗤?

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

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多