运行示例程序

关于安全性的注意事项

服务器和 Client 端程序在安装了安全 管理 器的情况下运行。在运行这两个程序时,需要指定一个安全策略文件,以便为代码授予运行它所需的安全权限。这是与服务器程序一起使用的策略文件的示例:

grant codeBase "file:/home/ann/src/" {
    permission java.security.AllPermission;
};

这是与 Client 端程序一起使用的策略文件的示例:

grant codeBase "file:/home/jones/src/" {
    permission java.security.AllPermission;
};

对于这两个示例策略文件,所有权限都授予该程序的本地 Classpath 中的类,因为本地应用程序代码是受信任的,但没有权限授予从其他位置下载的代码。因此,计算引擎服务器限制了它执行的任务(不知道其代码受信任并且可能是敌对的)执行需要安全权限的任何操作。示例 Client 端的Pi任务不需要任何权限即可执行。

在此示例中,服务器程序的策略文件名为server.policy,而 Client 端程序的策略文件名为client.policy

启动服务器

在启动计算引擎之前,您需要启动 RMI 注册表。 RMI 注册表是一个简单的服务器端引导程序命名工具,使远程 Client 端可以获取对初始远程对象的引用。可以使用rmiregistry命令启动。在执行rmiregistry之前,必须确保要运行rmiregistry的 Shell 程序或窗口没有设置CLASSPATH环境变量,或者没有设置CLASSPATH环境变量,而该变量不包含要下载到 Client 端的任何类的路径。远程对象。

要在服务器上启动注册表,请执行rmiregistry命令。该命令不产生任何输出,通常在后台运行。对于此示例,注册表在主机mycomputer上启动。

Microsoft Windows (如果start不可用,请使用javaw):

start rmiregistry

Solaris OS 或 Linux

rmiregistry &

默认情况下,注册表在端口 1099 上运行。要在其他端口上启动注册表,请在命令行上指定端口号。不要忘记取消设置CLASSPATH环境变量。

微软 Windows

start rmiregistry 2001

Solaris OS 或 Linux

rmiregistry 2001 &

启动注册表后,即可启动服务器。您需要确保compute.jar文件和远程对象实现类都在您的 Classpath 中。启动计算引擎时,需要使用java.rmi.server.codebase属性指定可通过网络访问服务器的类。在此示例中,可供下载的服务器端类是ComputeTaskinterface,它们在用户annpublic_html\classes目录的compute.jar文件中可用。计算引擎服务器在主机mycomputer上启动,主机mycomputer与启动注册表的主机相同。

微软 Windows

java -cp c:\home\ann\src;c:\home\ann\public_html\classes\compute.jar
     -Djava.rmi.server.codebase=file:/c:/home/ann/public_html/classes/compute.jar
     -Djava.rmi.server.hostname=mycomputer.example.com
     -Djava.security.policy=server.policy
        engine.ComputeEngine

Solaris OS 或 Linux

java -cp /home/ann/src:/home/ann/public_html/classes/compute.jar
     -Djava.rmi.server.codebase=http://mycomputer/~ann/classes/compute.jar
     -Djava.rmi.server.hostname=mycomputer.example.com
     -Djava.security.policy=server.policy
        engine.ComputeEngine

上面的java命令定义了以下系统属性:

  • java.rmi.server.codebase属性指定一个位置,即一个代码库 URL,可从该位置下载源于此服务器的类的定义。如果代码库指定了目录层次结构(与 JAR 文件相对),则必须在代码库 URL 的末尾添加斜杠。

  • java.rmi.server.hostname属性指定要在此 Java 虚拟机中导出的远程对象的存根中放入的主机名或地址。该值是 Client 端try通信远程方法调用时使用的主机名或地址。默认情况下,RMI 实现使用java.net.InetAddress.getLocalHost API 指示的服务器 IP 地址。但是,有时此地址并不适合所有 Client 端,并且标准主机名会更有效。为确保 RMI 为可从所有潜在 Client 端路由的服务器使用主机名(或 IP 地址),请设置java.rmi.server.hostname属性。

  • java.security.policy属性用于指定包含您打算授予的权限的策略文件。

启动 Client 端

注册表和计算引擎运行之后,您可以启动 Client 端,并指定以下内容:

  • Client 端使用java.rmi.server.codebase属性为其提供类(Pi类)的位置

  • java.security.policy属性,用于指定安全策略文件,该文件包含您打算授予各种代码的权限

  • 作为命令行参数,服务器的主机名(以便 Client 端知道Compute远程对象的位置)以及在服务器中使用的小数位数。

pi 符号

calculation

如下所示在另一台主机(例如,名为mysecondcomputer的主机)上启动 Client 端:


微软 Windows

java -cp c:\home\jones\src;c:\home\jones\public_html\classes\compute.jar
     -Djava.rmi.server.codebase=file:/c:/home/jones/public_html/classes/
     -Djava.security.policy=client.policy
        client.ComputePi mycomputer.example.com 45

Solaris OS 或 Linux

java -cp /home/jones/src:/home/jones/public_html/classes/compute.jar
     -Djava.rmi.server.codebase=http://mysecondcomputer/~jones/classes/
     -Djava.security.policy=client.policy
        client.ComputePi mycomputer.example.com 45

请注意,在命令行上设置了 Classpath,以便解释器可以找到 Client 端类和包含interface的 JAR 文件。还要注意,java.rmi.server.codebase属性的值(指定目录层次结构)以斜杠结尾。

启动 Client 端后,将显示以下输出:

3.141592653589793238462643383279502884197169399

下图说明了rmiregistryComputeEngine服务器和ComputePiClient 端在程序执行期间获取类的位置。

注册表,计算引擎和 Client 端在程序执行期间获取类

ComputeEngine服务器在注册表中绑定其远程对象引用时,注册表将下载存根类所依赖的ComputeTaskinterface。这些类是从ComputeEngine服务器的 Web 服务器或文件系统下载的,具体取决于启动服务器时使用的代码库 URL 的类型。

因为ComputePiClient 端在其 Classpath 中同时具有ComputeTaskinterface,所以它从其 Classpath 而不是从服务器的代码库加载其定义。

最后,当在executeTask远程调用中将Pi对象传递给ComputeEngine对象时,将Pi类加载到ComputeEngine服务器的 Java 虚拟机中。 Pi类由服务器从 Client 端的 Web 服务器或文件系统加载,具体取决于启动 Client 端时使用的代码库 URL 的类型。