精华区 [关闭][返回]

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

主题:RMI规范--第五章(7)
发信人: daystream()
整理人: biubiu(2000-01-04 11:47:49), 站内信件
5.7 LoaderHandler 接口 
package java.rmi.server;

public interface LoaderHandler {

    Class loadClass(String name)
    throws MalformedURLException, ClassNotFoundException;
    Class loadClass(URL codebase,String name)
throws MalformedURLException, ClassNotFoundException;
Object getSecurityContext(ClassLoader loader);
}



--------------------------------------------------------------
注意 - JDK1.2 中不鼓励使用 LoaderHandler 接口。 


--------------------------------------------------------------
LoaderHandler 接口仅由 JDK1.1 的内部 RMI 实现使用。


5.8 RMI 套接字工厂 
当 RMI 运行时实现需要 java.net.Socket 和 java.net.ServerSocket 的实
例以用于连接时,它并非直接实例化这些类的对象,而是在当前 RMISocketFact
ory 
对象(该对象由静态方法 RMISocketFactory.getSocketFactory 返回)上调
用 createSocket 和 createServerSocket 方法。这将使应用程序可以用钩子
来自定义 RMI 传输所用的套接字类型,例如 java.net.Socket 和 
java.net.ServerSocket 类的子类。所用的 RMISocketFactory 实例可由可
信任的系统代码设置一次。在 JDK 1.1 中,这种自定义被限制为关于套接字类

型的相对全局的决策,因为提供给工厂方法的参数只有主机和端口(对于 
createSocket)及端口号(对于 createServerSocket)。

在 JDK 1.2 中,我们引入了新的接口 RMIServerSocketFactory 和 
RMIClientSocketFactory,可更加灵活地自定义与远程对象通讯所用的协议。 


为使使用 RMI 的应用程序能利用这些新的套接字工厂接口,我们在 
UnicastRemoteObject 和 java.rmi.activation.Activatable 中添加了几
个新构造函数和 exportObject 方法,它们使用客户机和服务器套接字工厂做
为附加参数。

由新构造函数或 exportObject 方法(以 RMIClientSocketFactory 和 
RMIServerSocketFactory 为参数)导出的远程对象将被 RMI 运行时区别对待
。在这种远程对象的生命期内,运行时将用自定义 RMIServerSocketFactory 
来创建 ServerSocket 以接受对远程对象的到来的调用,同时用自定义 
RMIClientSocketFactory 来创建 Socket 以连接客户机和远程对象。

由自定义套接字工厂导出的远程对象 stub 和 skeleton 所用的 RemoteRef 
和 ServerRef 实现分别是 UnicastRef2 和 UnicastServerRef2。UnicastRef2 

类型的线表示法包含与 UnicastRef 类型不同的联系“端点”的表示法(仅用
一个 UTF 格式的主机名字符串,后跟一个整型端口号表示)。对于 
UnicastRef2,该端点的线表示则包括一个格式字节,用来指定端点表示的其余

内容(允许将来扩充),后跟的是指定格式的数据。当前,这些数据可包含 
UTF 格式的主机名、端口号及可选的(由端点格式字节指定)
RMIClientSocketFactory 对象序列化表示。它可被客户机用于在该端点生成
到远程对象的套接字连接。端点表示不包括在远程对象导出时指定的 
RMIServerSocketFactory 对象。

当通过 UnicastRef2 类型的引用进行调用时,运行时将在创建远程对象的套
接字连接时使用端点中 RMIClientSocketFactory 对象的 createSocket 方
法。同样,当运行时为了特定远程对象进行 DGC "dirty" 和 "clean" 调用
时,它必须在远程虚拟机上调用 DGC,方法是使用远程引用中指定的同一 
RMIClientSocketFactory 对象所生成的连接。服务器端的 DGC 实现应负责
验证结果是否正确。

如果远程对象是由老的构造函数或 UnicastRemoteObject 中没有将自定义套
接字工厂作为参数的方法导出,则和以前一样拥有 UnicastRef 和 
UnicastServerRef 类型的 RemoteRef 和 ServerRef,并且其端点也将使用
老式线表示,即一个 UTF 格式的主机字符串跟一个指定端口号的整数。这样那

些不使用 JDK 1.2 新特性的 RMI 服务器可以与老式 RMI 客户机进行互操作。


5.8.1 RMISocketFactory 类 
java.rmi.server.RMISocketFactory 抽象类提供一个接口来指定传输中如何
获得套接字。注意,下面的类使用 java.net 包中的 Socket 和 ServerSocket。


package java.rmi.server;
public abstract class RMISocketFactory
implements RMIClientSocketFactory, RMIServerSocketFactory
{

public abstract Socket createSocket(String host, int port)
throws IOException;
?public abstract ServerSocket createServerSocket(int port)
throws IOException;
public static void setSocketFactory(RMISocketFactory fac)
throws IOException;
public static RMISocketFactory getSocketFactory();
public static void setFailureHandler(RMIFailureHandler fh);
public static RMIFailureHandler getFailureHandler();
}


静态方法 setSocketFactory 可用于设置套接字工厂,而 RMI 将从中获得套接字
。应用程序用自己的实例 RMISocketFactory 仅能调用该方法一次。例如,应用
程序定义的 RMISocketFactory 实现在所要求的连接上做一些基本的过滤并抛出
异常,或者返回其对 java.net.Socket 或 java.net.ServerSocket 类的扩展(
例如提供安全信道的扩展)。注意,只有在当前安全管理器允许设置套接字工厂
时才可设置 RMISocketFactory。如果不允许进行该项设置,则将抛出 Security
Exception。

静态方法 getSocketFactory 返回由 RMI 使用的套接字工厂。如果未设置套接字
工厂,则返回值为 null。

当传输需要创建套接字时,传输层将在 getSocketFactory 方法返回的 RMISock
etFactory 上调用 createSocket 和 createServerSocket 方法。例如:

RMISocketFactory.getSocketFactory().createSocket(myhost, myport)


方法 createSocket 应创建一个连接到指定 host 和 port 的客户机套接字。 c
reateServerSocket 方法应在指定 port 上创建服务器套接字。 

缺省的 RMISocketFactory 传输实现使用 HTTP 通过防火墙提供透明的 RMI,如
下所述:

在 createSocket 中,工厂将自动尝试与无法用套接字直接联系的主机建立 HTT
P 连接。 
在 createServerSocket 中,工厂将返回用于自动检测新接受的连接是否为 HTT
P POST 请求的服务器套接字。如果是,则返回仅将请求主体透明地展示给传输然
后将其输出格式化为 HTTP 响应的套接字。 
方法 setFailureHandler 设置失败句柄。在创建服务器套接字失败时,该句柄将
由 RMI 运行时调用。该句柄返回一个布尔值,用于指示是否应重试。缺省的失败
句柄返回值为 false,意味着缺省情况下运行时将不再尝试创建套接字。

方法 getFailureHandler 在套接字创建失败时返回当前句柄。失败句柄未设置时
将为 null。




5.8.2 RMIServerSocketFactory 接口 
为了支持与远程对象的自定义通信,可以在导出远程对象时为其指定一个 RMISe
rverSocketFactory 实例。这一点既可通过相应的 UnicastRemoteObject 构造函
数或 exportObject 方法完成,也可通过相应的 java.rmi.activation.Activat
able 构造函数或 exportObject 方法完成。如果该服务器套接字工厂在导出远程
对象时与之关联,则 RMI 运行时将使用远程对象的服务器套接字工厂来创建 Se
rverSocket(使用 RMIServerSocketFactory.createServerSocket 方法),以接
受远程客户机的连接。

package java.rmi.server;
public interface RMIServerSocketFactory {

public java.net.ServerSocket createServerSocket(int port)
throws IOException;
}



5.8.3 RMIClientSocketFactory 接口 
要自定义与远程对象的通信,可在导出时远程对象为其指定一个 RMIClientSock
etFactory 的实例。这一点既可通过相应的 UnicastRemoteObject 构造函数或 
exportObject 方法完成,也可通过相应的 java.rmi.activation.Activatable 
构造函数或 exportObject 方法完成。如果该客户机套接字工厂在导出远程对象
时与之相关联,则客户机套接字工厂将同远程对象的引用一起下载到远程虚拟机
。随后,RMI 运行时将使用 RMIClientSocketFactory.createSocket 方法来建立
从客户机到远程对象的连接。

package java.rmi.server;
public interface RMIClientSocketFactory {
public java.net.Socket createSocket(String host, int port)
throws IOException;
}



--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.191.124]

[关闭][返回]