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