发信人: daystream()
整理人: biubiu(2000-01-02 15:23:16), 站内信件
|
5.3 UnicastRemoteObject 类
类 java.rmi.server.UnicastRemoteObject 支持创建并导出远程对象。该类
实现的远程服务器对象具有下列特征:
对这种对象的引用至多仅在创建该远程对象的进程生命期内有效。
通过 TCP 传输与远程对象通信。
调用、参数和结果使用流协议在客户机和服务器之间进行通信。
package java.rmi.server;
public class UnicastRemoteObject extends RemoteServer {
protected UnicastRemoteObject()
throws java.rmi.RemoteException;
protected UnicastRemoteObject(int port)
throws java.rmi.RemoteException;
protected UnicastRemoteObject(int port,
RMIClientSocketFactory csf,
RMIServerSocketFactory ssf)
throws java.rmi.RemoteException;
public Object clone()
throws java.lang.CloneNotSupportedException;
public static RemoteStub exportObject(java.rmi.Remote obj)
throws java.rmi.RemoteException;
public static Remote exportObject(java.rmi.Remote obj, int por t)
throws java.rmi.RemoteException;
public static Remote exportObject(Remote obj, int port,
RMIClientSocketFactory csf,
RMIServerSocketFactory ssf)
throws java.rmi.RemoteException;
public static boolean unexportObject(java.rmi.Remote obj,
boolean force)
throws java.rmi.NoSuchObjectException;
}
5.3.1 构造新远程对象
远程对象实现(实现一个或多个远程接口的实现)必须被创建和导出。导出远程
对象使得对象能接受来自客户机的到来的调用。作为 UnicastRemoteObject
导出的远程对象,其导出涉及在 TCP 端口监听(注意,多个远程对象可以接受
同一端口的到来的调用,因此没必要在新的端口上监听)。远程对象实现可以扩
展类 UnicastRemoteObject 以使用其导出对象的构造函数,或者扩展其它类
(或者根本不扩展)并通过 UnicastRemoteObject 的 exportObject 方法导
出对象。
无参数的构造函数将创建远程对象并在匿名(或任意)端口上导出,而这将在运
行时进行选择。第二种形式的构造函数带单个参数(即 port),它指定远程对
象接受到来的调用的端口号。第三种构造函数创建的远程对象在指定端口上通过
RMIServerSocketFactory 创建的 ServerSocket 接受到来的调用;客户机
通过由 RMIClientSocketFactory 提供的 Socket 与远程对象建立连接。
5.3.2 导出并非由 RemoteObject 扩展而来的实现
exportObject 方法(任何形式)可用于导出不是由扩展 UnicastRemoteObject
类实现的简单对等远程对象。第一种形式的 exportObject 方法带单个参数
(即 obj),它是接受到来的 RMI 调用的远程对象;该 exportObject 方法
在匿名(或任意)端口上导出远程对象,而这将在运行时进行选择。第二种形式
的 exportObject 方法带两个参数,分别是远程对象 obj 和 port。port 是
远程对象接受到来的调用的端口号。第三种 exportObject 方法用指定的
RMIClientSocketFactory、csf 和 RMIServerSocketFactory、ssf 在指定
port 上导出对象 obj。
在作为参数或返回值传入 RMI 调用前,必须导出对象,否则当试图把“未导出
的”对象作为参数或返回值传递给一个远程调用时,将会抛出
java.rmi.server.StubNotFoundException。
导出后,对象既可作为参数传入 RMI 调用,也可作为 RMI 调用的结果返回。
exportObject 方法返回 Remote stub。它是远程对象的 stub 对象 obj,它
将替代远程对象被传入 RMI 调用。
5.3.3 在 RMI 调用中传递 UnicastRemoteObject
如上所述,当类型为 UnicastRemoteObject 的对象作为参数或返回值传入
RMI 调用中时,该对象将由远程对象的 stub 所代替。远程对象实现保留在创
建它的虚拟机中,且不会移出(包括其值)。换言之,远程对象通过引用传入
RMI 调用;远程对象实现不能通过值进行传递。
5.3.4 序列化 UnicastRemoteObject
如果 UnicastRemoteObject 类型的对象写入用户定义的 ObjectOutputStream
例如,该对象写入使用序列化的文件),则其中所含的信息将是瞬态的且未予保
存。但如果对象是用户定义的 UnicastRemoteObject 子类实例,它就能拥有
非瞬态数据并可在序列化对象时予以保存。
当 UnicastRemoteObject 从 ObjectInputStream 读出时,它将自动导出到
RMI 运行时,以便接收 RMI 调用。如果由于某种原因而导致导出失败,则序列
化恢复对象过程将予以终止,同时抛出异常。
5.3.5 逆导出 UnicastRemoteObject
unexportObject 方法使远程对象 obj 无法接受到来的调用。如果强制参数为
真,则即使有对远程对象的待定调用或当前调用,该远程对象仍将被强制逆导出 。
如果强制参数为假,则仅在无对该对象的待定调用和当前调用时才逆导出该对象 。如果对象被成功地逆导出,则运行时将把该对象从内部表中删除。以这种强制 方式逆导出对象可能导致客户机持有该远程对象的过期远程引用。如果远程对象 先前并未导出到 RMI 运行时中,则该方法将抛出异常 java.rmi.NoSuchObjectE xception。
5.3.6 clone 方法
只有支持 java.lang.Cloneable 接口的对象才可使用 Java 语言的缺省机制
复制。类 java.rmi.server.UnicastRemoteObject 并不实现该接口,但它实
现 clone 方法以便当子类需要实现 Cloneable 时远程对象可以正确地进行复
制。clone 方法可由子类用于创建一个初始内容相同的复制的远程对象。但是
可以被导出接受远程调用且与原对象有所不同。
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.191.124]
|
|