精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Java>>JAVA编程>>网络编程>>RMI>>RMI规范--第五章(3)

主题:RMI规范--第五章(3)
发信人: 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]

[关闭][返回]