运行示例程序
关于安全性的注意事项
服务器和 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
属性指定可通过网络访问服务器的类。在此示例中,可供下载的服务器端类是Compute
和Task
interface,它们在用户ann
的public_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
远程对象的位置)以及在服务器中使用的小数位数。
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
下图说明了rmiregistry
,ComputeEngine
服务器和ComputePi
Client 端在程序执行期间获取类的位置。
当ComputeEngine
服务器在注册表中绑定其远程对象引用时,注册表将下载存根类所依赖的Compute
和Task
interface。这些类是从ComputeEngine
服务器的 Web 服务器或文件系统下载的,具体取决于启动服务器时使用的代码库 URL 的类型。
因为ComputePi
Client 端在其 Classpath 中同时具有Compute
和Task
interface,所以它从其 Classpath 而不是从服务器的代码库加载其定义。
最后,当在executeTask
远程调用中将Pi
对象传递给ComputeEngine
对象时,将Pi
类加载到ComputeEngine
服务器的 Java 虚拟机中。 Pi
类由服务器从 Client 端的 Web 服务器或文件系统加载,具体取决于启动 Client 端时使用的代码库 URL 的类型。