客戶機(jī)接口
程序員在編寫使用遠(yuǎn)程對(duì)象的 applet 或應(yīng)用程序時(shí),需要注意 java.rmi 包
中可用的 RMI 系統(tǒng)客戶機(jī)可視接口。
4.1 遠(yuǎn)程接口
package java.rmi;
public interface Remote {}
java.rmi.Remote 接口用來識(shí)別所有遠(yuǎn)程接口;所有遠(yuǎn)程對(duì)象必須直接或間接
實(shí)現(xiàn)此接口。
實(shí)現(xiàn)類可以實(shí)現(xiàn)任意數(shù)目的遠(yuǎn)程接口,并可擴(kuò)展其它遠(yuǎn)程實(shí)現(xiàn)類。RMI 提供一些
遠(yuǎn)程對(duì)象實(shí)現(xiàn)可以擴(kuò)展的類,有助于遠(yuǎn)程對(duì)象的創(chuàng)建。這些類是
java.rmi.server.UnicastRemoteObject
和
java.rmi.activation.Activatable。
有關(guān)如何定義遠(yuǎn)程接口的詳細(xì)信息,參見“java.rmi.Remote 接口”(2.4.1)一
節(jié)。
4.2 RemoteException 類
類 java.rmi.RemoteException 是許多在執(zhí)行遠(yuǎn)程方法調(diào)用時(shí)可能發(fā)生的、與
通信有關(guān)的異常的通用超類。遠(yuǎn)程接口中的每種方法(也是一個(gè)接口)必須在其
throws 子句中列出 RemoteException(或其超類,如
java.io.IOException 或 java.lang.Exception)。
package java.rmi;
public class RemoteException extends java.io.IOException
{
public Throwable detail;
public RemoteException();
public RemoteException(String s);
public RemoteException(String s, Throwable ex);
public String getMessage();
public void printStackTrace();
public void printStackTrace(java.io.PrintStream ps);
public void printStackTrace(java.io.PrintWriter pw);
}
RemoteException 可用詳細(xì)消息(即 s)和一個(gè)嵌套異常(即 ex,Throwable)
進(jìn)行構(gòu)造。嵌套異常 ex 在構(gòu)造函數(shù)的第三種形式中被指定為參數(shù),通常是 RMI
調(diào)用過程中發(fā)生的基本 I/O 異常。
getMessage 方法返回異常的詳細(xì)消息,包括嵌套異常(如果有)中的消息。
printStackTrace 方法在類 java.lang.Throwable 中將被覆蓋掉,以打印嵌套異
常的堆棧跟蹤。
4.3 Naming 類
java.rmi.Naming 類提供存儲(chǔ)和獲得對(duì)遠(yuǎn)程對(duì)象注冊服務(wù)程序中遠(yuǎn)程對(duì)象進(jìn)行
引用的方法。Naming 類中的方法以如下形式的,URL 格式的 java.lang.String
作為其中的一個(gè)參數(shù):
//host:port/name
其中 host 是注冊服務(wù)程序所在的主機(jī)(遠(yuǎn)程或本地),port 是注冊服務(wù)程序
接收調(diào)用的端口號(hào),name 是注 冊表未作出解釋的簡單字符串。host 和 port
是可選的。如果省略了 host,則主機(jī)缺省值為本地 主機(jī)。如果省略了 port,
則端口缺省值為 1099,即 RMI 系統(tǒng)注冊服務(wù)程序 rmiregistry 所用的“眾所
周知”的端口。
為遠(yuǎn)程對(duì)象綁定名稱即為稍后使用的遠(yuǎn)程對(duì)象關(guān)聯(lián)或注冊名稱,可用于查詢該遠(yuǎn)
程對(duì)象。可以使用 Naming 類的 bind 或 rebind 方法將遠(yuǎn)程對(duì)象與名稱相關(guān)聯(lián)
。
當(dāng)遠(yuǎn)程對(duì)象已用 RMI 注冊服務(wù)程序在本地主機(jī)上進(jìn)行過注冊(綁定)后,遠(yuǎn)程
(或本地)主機(jī)上的調(diào)用程序就可以按名稱查詢遠(yuǎn)程對(duì)象、獲得其引用,然后在
對(duì)象上調(diào)用遠(yuǎn)程方法。必要時(shí),某一主機(jī)上運(yùn)行的服務(wù)器可以共享一個(gè)注冊服務(wù)
程序。
服務(wù)器的各個(gè)進(jìn)程也可創(chuàng)建和使用自己的注冊服務(wù)程序
(詳細(xì)信息,參見 java.rmi.registry.LocateRegistry.createRegistry 方法)
。
package java.rmi;
public final class Naming
{
public static Remote lookup(String url)
throws NotBoundException, java.net.MalformedURLException, RemoteException;
public static void bind(String url, Remote obj)
throws AlreadyBoundException, java.net.MalformedURLException, RemoteException;
public static void rebind(String url, Remote obj)
throws RemoteException, java.net.MalformedURLException;
public static void unbind(String url)
throws RemoteException, NotBoundException, java.net.MalformedURLException;
public static String[] list(String url)
throws RemoteException, java.net.MalformedURLException;
}
lookup 方法返回與名稱的文件部分相關(guān)聯(lián)的遠(yuǎn)程對(duì)象。如果名稱未綁定到對(duì)象上
,則拋出 NotBoundException。
bind 方法將把指定名稱綁定到遠(yuǎn)程對(duì)象上。如果該名稱已綁定到某一對(duì)象上,
則拋出 AlreadyBoundException。
rebind 方法總將名稱綁定到對(duì)象上,無論該名稱是否已綁定。原有綁定將丟失。
unbind 方法將取消名稱和遠(yuǎn)程對(duì)象間的綁定。如果沒有綁定,則拋出 NotBound
Exception。
list 方法返回一個(gè) String 對(duì)象的數(shù)組,該對(duì)象包含注冊服務(wù)程序中綁定 URL
的快照。
為了向注冊服務(wù)程序查詢其內(nèi)容列表,只需要 URL 上的主機(jī)名和端口信息;因此
,URL 的“file”部分將被忽略。
----------------------------------------------------------------------
----------
注意 - 這些方法也可能拋出 java.rmi.AccessException。AccessException 表
示調(diào)用程序無執(zhí)
行特定操作的權(quán)限。例如,只有運(yùn)行注冊服務(wù)程序的主機(jī)上的本地客戶機(jī)才允許
執(zhí)行 bind、rebind
和 unbind 操作。但任何非本地客戶機(jī)都可調(diào)用 lookup 操作。
凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
、轉(zhuǎn)載請注明來處和原文作者。非常感謝。