Está compilación/ejecución supone que existe un archivo .jar en donde se encuentran las interfaces y stubs del servidor que el cliente necesecita conocer. En cambio, el código que el cliente necesita enviar al servidor se coloca en una página Web alcanzable por el servidor.
Reemplace /usr/local/java1.2 por el directorio en donde se encuentra
JDK1.2 en su máquina.
set path=(/usr/local/java1.2/bin $path)
Verifique que la versión accesible de java es la 1.2 ejecutando el comando java -version. En Solaris el resultado de este comando es:
Todos los programas que usa este ejemplo deben ser ejecutados
con JDK 1.2. No mezcle procesos que usan
JDK1.2 con otros que usan JDK1.1.
% java -version
java version "1.2.1"
Solaris VM (build Solaris_JDK_1.2.1_03, native threads, sunwjit)
% javac ComputeEngine.java
% rmic -d . ComputeEngine
% ls
... ComputeEngine_Skel.class ComputeEngine_Stub.class ...
Los stubs y skeletons se encargan de establecer una conexión entre los
clientes y un objeto remoto. Los stubs corren en la parte cliente
y los skel en el servidor. Observe que los fuentes de stubs
y skels son borrados (porque no se necesitan).
Compruebe que el archivo contiene todas las clases necesarias:
% jar cvf compute.jar *.class
added manifest
adding: Compute.class(in = 247) (out= 179)(deflated 27%)
adding: ComputeEngine.class(in = 1423) (out= 781)(deflated 45%)
adding: ComputeEngine_Skel.class(in = 1726) (out= 963)(deflated 44%)
adding: ComputeEngine_Stub.class(in = 3211) (out= 1565)(deflated 51%)
adding: Task.class(in = 183) (out= 151)(deflated 17%)
%
Este archivo debe ser colocado en cualquier máquina en donde desee
lanzar el registro de objetos remotos y en donde va a ejecutar el o
los clientes. El archivo compute.jar debe ser especificado en
la variable CLASSPATH.
% jar tvf compute.jar
...
%
En donde "..." es el directorio en donde colocó el archivo compute.jar.
% setenv CLASSPATH .../compute.jar
% rmiregistry
% setenv CLASSPATH .../compute.jar
% java java -Djava.security.policy=.../java.policy ComputeEngine compute
ComputeEngine bound
El archivo java.policy describe las operaciones que pueden
realizar las clases de los clientes que se carguen dinámicamente a partir
del Web.
% setenv CLASSPATH .:.../compute.jar
% javac ComputePi.java
Supongamos que Ud. puede publicar archivos en la dirección http://www.dcc.uchile.cl/~jperez/Pi/. Entonces genere la distribución del cliente mediante:
% jar pi.jar *.class
added manifest
adding: ComputePi.class(in = 1207) (out= 720)(deflated 40%)
adding: Pi.class(in = 1340) (out= 781)(deflated 41%)
%
Ahora, entreténgase calculando Pi con 10000 decimales.
% setenv CLASSPATH .../pi.jar:.../compute.jar
% java -Djava.rmi.server.codebase="http://www.dcc.uchile.cl/~jperez/Pi/pi.jar" \
ComputePi //borg.dcc.uchile.cl/compute 40
3.1415926535897932384626433832795028841972
Como seguramente Ud. ha encontrado algún error que impide hacer la conexión revise cuidadosamente cada uno de los pasos señalados en esta página. ¡Cuidado! Aún cuando el servidor logró conectarse, el error puede estar en la forma en que lanzó el servidor. Revise también esos pasos.
Envíeme vía mail su error favorito para colocarlo en esta página.
La implementación del registro de RMI requiere cargar dinámicamente los stubs correspondientes a los objetos que ahí se registran. Como los stubs serán clases desconocidas para el registro, lo usual es que estos stubs se carguen de la red.
En consecuencia los procesos que requieran exportar objetos mediante el registro de RMI incluirán la cláusula -Djava.rmi.server.codebase=... para señalar el sitio en donde el registro ubicará los stubs. El ejemplo del tutorial de Java/RMI considera ese caso.