国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
第 8 章
第 8 章
本章包含 rmic stub 編譯器生成的 stub 和 skleton 所用的接口和類。
主題:
RemoteStub 類
RemoteCall 接口
RemoteRef 接口
ServerRef 接口
Skeleton 接口
Operation 類
8.1 RemoteStub 類
java.rmi.server.RemoteStub 類是遠程對象 stub 的通用超類。stub 對象是一
種代理,它支持的遠程接口集與遠程對象的實際實現(xiàn)所定義的完全相同。
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 的第一個構造函數(shù)將創(chuàng)建帶有空遠程引用的 stub。第二個構造函數(shù)
將創(chuàng)建帶有給定遠程引用 ref 的 stub。
JDK1.2 中不鼓勵使用(且不支持)setRef 方法。
8.1.1 遠程對象與 stub 類的類型等價性
客戶機可與 stub(代理)對象進行交互,該 stub 的遠程接口集與遠程對象類所
定義的完全相同。由于 stub 類是由實現(xiàn)一個或多個遠程接口的實現(xiàn)類精華所生
成的,因此 stub 類不包括類層次(組成對象的類型圖)的非遠程部分。例如,
如果 C 擴展 B 而 B 擴展 A,但只有 B 實現(xiàn)遠程接口,則 stub 將由 B 生成,
而非 C。
由于 stub 實現(xiàn)與遠程對象類相同的遠程接口集,因此從 Java 系統(tǒng)的角度看,
stub 擁有與服務器對象類型圖的遠程部分相同的類型。這樣,客戶機即可利用內(nèi)
置 Java 操作來檢查遠程對象的類型,同時也可從一個遠程接口向另一遠程接口
進行強制類型轉換。
stub 是用 rmic 編譯器生成的。
8.1.2 聲明為終態(tài)的對象方法的語義
以下方法在 java.lang.Object 類中被聲明為終態(tài) final,因此不能被任意實現(xiàn)
所覆蓋:
getClass
notify
notifyAll
wait
getClass 的缺省實現(xiàn)適用于所有 Java 對象(本地或遠程);對于遠程對象,該
方法不需要專門的實現(xiàn)。getClass 方法在遠程 stub 上使用時,它報告由 rmic
生成的 stub 對象的確切類型。注意,stub 類型僅反映遠程對象實現(xiàn)的遠程接
口,而非本地接口。
java.lang.Object 的 wait 和 notify 方法將處理 Java 語言線程模型上下文中
的等待和通知。雖然對遠程 stub 使用這些方法不會違反 Java 線程模型,但這
些方法的語義將與用于本地 Java 對象時的語義不同。尤其,使用這些方法時所
操作的將是遠程對象的客戶機本地引用 (stub),而不是遠程站點的實際對象。
8.2 RemoteCall 接口
RemoteCall 是遠程對象的 stub 和 skeleton 所用的抽象接口,用來執(zhí)行對遠程
對象的調(diào)用。
----------------------------------------------------------------------
----------
注意 - JDK 1.2 中不鼓勵使用 RemoteCall 接口。JDK 1.2 stub 協(xié)議也已不再
使用此接口?,F(xiàn)在,stub 在 JDK 1.2 中使用新的 invoke 方法,該方法不需要
將 RemoteCall 作為參數(shù)。

----------------------------------------------------------------------
----------
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 將把參數(shù)編組到其中,或者 skeleton
將把結果編組到其中。
方法 releaseOutputStream 釋放輸出流。在某些傳輸中,這將導致釋放流。
方法 getInputStream 返回 InputStream。stub 從中解編結果,或者 skeleton
從中解編參數(shù)。
方法 releaseInputStream 釋放輸入流。這將允許某些傳輸提前釋放連接的輸入
端。
方法 getResultStream 返回輸出流(寫完與調(diào)用成功有關的標題信息后)。每次
遠程調(diào)用將只能獲得一次結果流。如果 success 為真,則要編組的結果屬于正常
返回;否則結果為異常。如果已獲得該遠程調(diào)用的結果流,則拋出
StreamCorruptedException。
方法 executeCall 盡其所能執(zhí)行調(diào)用。
方法 done 允許完成遠程調(diào)用后進行清除。
.3 RemoteRef 接口
接口 RemoteRef 表示遠程對象的句柄。每個 stub 均包含 RemoteRef 的一個實
例,其中包含引用的具體表示。該遠程引用將用來在其代表的遠程對象上執(zhí)行遠
程調(diào)用。
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 方法將方法調(diào)用代理給 stub (obj) 的遠程引用,并允許引用負
責建立對遠程主機的連接,將 method 和參數(shù) params 的一些表示進行編組,然
后使用方法調(diào)用與遠程主機進行通訊。該方法將返回駐留在遠程主機上的遠程對
象的方法調(diào)用結果,或者在調(diào)用失敗時拋出 RemoteException,而在遠程調(diào)用拋
出異常時則拋出應用程序級異常。注意,操作號 opnum 表示一散列方法簽名,可
以用來對要傳輸?shù)姆椒ㄟM行編碼。
opnum 的方法散列是一個 64 位(長)整數(shù),是根據(jù)美國國家標準技術局 (NIST
) 的安全散列算法 (SHA-1),用字節(jié)流消息摘要的前兩個 32 位值計算而來的。
字節(jié)流包含由遠程方法名后跟其方法描述符組成的字符串的 UTF 編碼(有關方法
描述符的說明,參見 Java 虛擬機規(guī)范的第 4.3.3 節(jié))。散列值將從 SHA-1 散
列的第一個和第二個 32 位值得到。
long hash = sha[1] << 32 + sha[0]
 
----------------------------------------------------------------------
----------
注意 - JDK 1.2 中不鼓勵使用 newCall、invoke 和 done 方法。rmic 用 JDK
1.2 stub 協(xié)議版本生成的 stub 不再使用這些方法。由 newCall、invoke 和 d
one 組成的調(diào)用序列已被新的 invoke 方法所替換,該新方法將 Method 對象作
為一個參數(shù)。

----------------------------------------------------------------------
----------
方法 newCall 將為遠程對象 obj 上的新遠程方法調(diào)用創(chuàng)建相應的調(diào)用對象。操
作數(shù)組 op 包含遠程對象上的可用操作。操作號 opnum 是對操作數(shù)組的索引,它
指定該遠程調(diào)用的特定操作。 傳遞操作數(shù)組和索引可使 stub 生成器能分派操作
索引并進行解釋。遠程引用可能需要操作說明以在調(diào)用中進行編碼。
方法 invoke 負責執(zhí)行遠程調(diào)用。invoke 將產(chǎn)生能順利通過而不被 stub 捕獲的
“用戶”異常。如果在遠程調(diào)用過程中產(chǎn)生異常,則 invoke 應注意在產(chǎn)生“用
戶異常”或 RemoteException 之前清除連接。
方法 done 允許遠程引用清除(或重新使用)連接。只有當 invoke 調(diào)用已成功
地(非異常)返回 stub 時,才應調(diào)用 done。
方法 getRefClass 返回將被序列化到流 out 上的引用類型的非包限定的類全名
。
方法 remoteHashCode 返回遠程對象的散列碼。兩個引用相同遠程對象的遠程對
象 stub 將有相同的散列碼(以支持在散列表中將遠程對象作為鍵值)。Remote
Object 將把對其 hashCode 方法的調(diào)用轉發(fā)給遠程引用的 remoteHashCode 方法
方法 remoteEquals 比較兩個遠程對象的等價性。如果兩個遠程對象引用相同的
遠程對象,即認為它們等價。例如,如果兩個 stub 引用相同的遠程對象,則認
為它們等價。 RemoteObject 將把對其 equals 方法的調(diào)用轉發(fā)給遠程引用的 r
emoteEquals 方法。
方法 remoteToString 返回表示該遠程對象的引用的 String。
8.4 ServerRef 接口
接口 ServerRef 表示遠程對象實現(xiàn)的服務器端句柄。
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 對象實現(xiàn) obj 查找或創(chuàng)建客戶機 st
ub 對象。參數(shù) data 包含導出對象所需的信息(如端口號)。
方法 getClientHost 返回當前客戶機的主機名。當它被當前正在處理遠程對象調(diào)
用的線程調(diào)用時,將返回執(zhí)行此調(diào)用的客戶機主機名。如果當前某一遠程方法調(diào)
用未處于服務狀態(tài),則調(diào)用 ServerNotActiveException。
8.5 Skeleton 接口
接口 Skeleton 僅能由 rmic 編譯器所生成 skeleton 的實現(xiàn)。遠程對象的 ske
leton 是服務器端的實體,它將為實際遠程對象實現(xiàn)分配調(diào)用。

----------------------------------------------------------------------
----------
注意 - JDK1.2 中不鼓勵使用 Skeleton 接口。每個由 rmic stub 編譯器生成的
1.1(以及在 1.2 中由缺省 rmic -vcompat 生成的兼容 1.1 的 skeleton)sk
eleton 類均實現(xiàn)該接口。JDK1.2 兼容版本中分配遠程方法調(diào)用將不再需要 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 對象中獲得的輸入流中的參數(shù),調(diào)用實際遠程對象實
現(xiàn) obj 上的方法(由操作號 opnum 表示),然后將返回值進行編組。如果在調(diào)
用過程中發(fā)生異常,則拋出異常。
getOperations 方法返回包含遠程對象方法的操作描述符的數(shù)組。
8.6 Operation 類
類 Operation 包含對遠程對象 Java 方法的說明。

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

----------------------------------------------------------------------
----------
package java.rmi.server;
public class Operation
{
public Operation(String op);
public String getOperation();
public String toString();
}

構造 Operation 對象時通常帶有方法簽名。
方法 getOperation 返回操作描述符的內(nèi)容(其初始化時使用的值)。
方法 toString 也返回操作描述符的字符串表示(通常為方法簽名)。
 
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
rmi入門教程,簡單明了(轉)
Java RMI 入門
Java分布式處理技術(RMI,JDNI)
Java RMI與RPC,JMS的比較
利用RMI實現(xiàn)JAVA分布式應用
漫談EJB(1)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服