Programação usando RMI

Introdução

Criação do Objeto Remoto

Definição da Interface Remota

package compute;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Compute extends Remote {
    Object executeTask(Task tthrows RemoteException;
}
package compute;

import java.io.Serializable;

public interface Task extends Serializable {
    Object execute();
}

Implementação da Interface Remota

package engine;

import java.rmi.*;
import java.rmi.server.*;
import compute.*;

public class ComputeEngine extends UnicastRemoteObject
                           implements Compute
{
    public ComputeEngine() throws RemoteException {
        super();
    }

    public Object executeTask(Task t) {
        return t.execute();
    }

    public static void main(String[] args) {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }
        String name = "//localhost/Compute";
        try {
            Compute engine = new ComputeEngine();
            Naming.rebind(name, engine);
            System.out.println("ComputeEngine bound");
        catch (Exception e) {
            System.err.println("ComputeEngine exception: " 
             e.getMessage());
            e.printStackTrace();
        }
    }
}

Criação do Programa Cliente

Criando uma Tarefa para o Cálculo do PI

package client;

import compute.*;
import java.math.*;

public class Pi implements Task {

    /** constants used in pi computation */
    private static final BigDecimal ZERO = 
        BigDecimal.valueOf(0);
    private static final BigDecimal  ONE = 
        BigDecimal.valueOf(1);
    private static final BigDecimal FOUR = 
        BigDecimal.valueOf(4);

    /** rounding mode to use during pi computation */
    private static final int roundingMode = 
        BigDecimal.ROUND_HALF_EVEN;

    /** digits of precision after the decimal point */
    private int digits;
    
    /**
     * Construct a task to calculate pi to the specified
     * precision.
     */
    public Pi(int digits) {
        this.digits = digits;
    }

    /**
     * Calculate pi.
     */
    public Object execute() {
        return computePi(digits);
    }

    /**
     * Compute the value of pi to the specified number of 
     * digits after the decimal point.  The value is 
     * computed using Machin's formula:
     *
     *          pi/4 = 4*arctan(1/5) - arctan(1/239)
     *
     * and a power series expansion of arctan(x) to 
     * sufficient precision.
     */
    public static BigDecimal computePi(int digits) {
        int scale = digits + 5;
        BigDecimal arctan1_5 = arctan(5, scale);
        BigDecimal arctan1_239 = arctan(239, scale);
        BigDecimal pi = arctan1_5.multiply(FOUR).subtract(
                                  arctan1_239).multiply(FOUR);
        return pi.setScale(digits, 
                           BigDecimal.ROUND_HALF_UP);
    }
    /**
     * Compute the value, in radians, of the arctangent of 
     * the inverse of the supplied integer to the speficied
     * number of digits after the decimal point.  The value
     * is computed using the power series expansion for the
     * arc tangent:
     *
     * arctan(x) = x - (x^3)/3 + (x^5)/5 - (x^7)/7 + 
     *     (x^9)/9 ...
     */   
    public static BigDecimal arctan(int inverseX, 
                                  int scale
    {
        BigDecimal result, numer, term;
        BigDecimal invX = BigDecimal.valueOf(inverseX);
        BigDecimal invX2 = 
            BigDecimal.valueOf(inverseX * inverseX);

        numer = ONE.divide(invX, scale, roundingMode);

        result = numer;
        int i = 1;
        do {
            numer = 
                numer.divide(invX2, scale, roundingMode);
            int denom = * i + 1;
            term = 
                numer.divide(BigDecimal.valueOf(denom),
                             scale, roundingMode);
            if ((i % 2!= 0) {
                result = result.subtract(term);
            else {
                result = result.add(term);
            }
            i++;
        while (term.compareTo(ZERO!= 0);
        return result;
    }
}

Criando o Cliente

package client;

import java.rmi.*;
import java.math.*;
import compute.*;

public class ComputePi {
    public static void main(String args[]) {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }
        try {
            String name = "//" + args[0"/Compute";
            Compute comp = (ComputeNaming.lookup(name);
            Pi task = new Pi(Integer.parseInt(args[1]));
            BigDecimal pi = (BigDecimal) (comp.executeTask(task));
            System.out.println(pi);
        catch (Exception e) {
            System.err.println("ComputePi exception: " 
                               e.getMessage());
            e.printStackTrace();
        }
    }
}

Compilando a Aplicação

Compilando as Classes da Aplicação

cd /home/usuario
mkdir lab_rmi
cd lab_rmi
cd /home/usuario/lab_rmi
mkdir src
mkdir classes
cd /home/usuario/lab_rmi/src
javac -d ../classes client/*.java engine/*.java compute/*.java

Distribuindo a Aplicação

cd /home/usuario/lab_rmi
mkdir cliente
mkdir servidor
cp -r classes/client classes/compute cliente
cp -r classes/engine classes/compute servidor

Gerando os Stubs RMI

cd /home/usuario/lab_rmi/servidor
rmic engine.ComputeEngine

Executando a Aplicação

Definindo as Políticas de Segurança

grant {
    permission java.net.SocketPermission "*:1024-65535",
        "connect,accept";
    permission java.io.FilePermission
        "/home/usuario/lab_rmi/servidor/-", "read";
};
grant {
    permission java.net.SocketPermission "*:1024-65535",
        "connect,accept";
    permission java.io.FilePermission
        "/home/usuario/lab_rmi/cliente/-", "read";
};

Executando o Servidor

cd /tmp
rmiregistry &
cd /home/usuario/lab_rmi/servidor
java -Djava.rmi.server.codebase=file:/home/usuario/lab_rmi/servidor/ 
     -Djava.security.policy=java.policy 
     engine.ComputeEngine

Executando o Cliente

cd /home/usuario/lab_rmi/cliente
java -Djava.rmi.server.codebase=file:/home/usuario/lab_rmi/cliente/ 
     -Djava.security.policy=java.policy 
     client.ComputePi localhost 10
3.1415926536


Índice 
Hosted by www.Geocities.ws

1