编译例子程序
假定这些例子程序是在zelda用户的 home目录下开发的。服务器程序在用户zelda 的home目录下进行编译,之后把其拷贝到用户zelda的public_html目录中,以便运行。下面分别是在Unix和Win32平台下的命令序列,在命令序列之后的是解释:
Unix:
cd /home/zelda/classes
javac Send.java
javac RemoteServer.java
javac RMIClient2.java
javac RMIClient1.java
rmic -d . RemoteServer
cp RemoteServer*.class /home/zelda/public_html/classes
cp Send.class /home/zelda/public_html/classes
Win32:
cd homezeldaclasses
javac Send.java
javac RemoteServer.java
javac RMIClient2.java
javac RMIClient1.java
rmic -d . RemoteServer
copy RemoteServer*.class homezeldapublic_htmlclasses
copy Send.class homezeldapublic_htmlclasses
开始的两个javac命令编译了RemoteServer和Send 的类和接口。第三个javac命令编译了RMIClient2类。最后一个javac命令对RMIClient1类进行了编译。
接下来的一行在RemoteServer 服务器类上运行rnic命令。该命令生成形式为ClassName_Stub.class和ClassName_Skel.class的输出类文件。这些输出类可以让客户在RemoteServer服务器对象中调用方法。
第一个拷贝命令把RemoteServer类文件及其对应的skel和stub类文件拷贝到一个公共可访问的目录/home/zelda/public_html/classes中,该目录位于服务器机器上。这样,这些类可以被客户机访问并下载。它们被放在网络服务器的public_html目录中,因为这些文件可以被客户程序使用URL来访问。
基于同样的理由,第二个拷贝命令把Send类文件放到同样的目录中。RMIClient1和RMIClient2类文件并不是公共可访问的,它们在其所在的客户机上,通过使用URL访问和下载public_html目录中的远程对象文件。
- RMIClient1是从客户端的目录进行调用的,在下载公共可访问文件时使用了服务器端的网络服务器软件以及客户端的Java虚拟机。
- RMIClient2也是在客户端进行调用的,在下载公共文件时,也使用了服务器端的服务器软件以及客户端的Java虚拟机。

启动RMI注册器
在启动客户程序之前,你必须启动RMI 注册器,这是个服务器端的命名机制,可以让远程客户获得对远程服务器对象的引用。
在启动RMI 注册器之前,在执行shell或者window 下的rmiregistry 命令之前,务必使得所在窗口中或者shell中的CLASSPATH环境变量不指向你的系统中的远程对象类,包括stub
和skel类。一旦 RMI 注册器在启动时发现了这些类,它将不能从服务器端的Java虚拟机上加载它们。这样,当客户端试图下载远程对象类时,将会产生问题。
下面的命令重置了CLASSPATH变量,并且在缺省的1099端口启动RMI 注册,你可以用如下格式指定一个不同的端口: rmiregistry 4444
&。如果你指定了一个不同的端口,你也必须在服务器端的程序中指定同样的端口。
Unix:
cd /home/zelda/public_html/classes
unsetenv CLASSPATH
rmiregistry &
Win32:
cd homezeldapublic_htmlclasses
set CLASSPATH=
start rmiregistry
注意点:现在你可以考虑把CLASSPATH还原为初始的设置。
|