Trabalho em sala.

Sistemas distribuídos.

Data: 19/04/2010

Valor : 2 pontos.

 

 

Observe os códigos em linguagem Java abaixo. Eles implementam uma arquitetura cliente/servidor que se utliza de RMI (invocação de métodos remotos) para  estabelecer a comunicação entre as partes.

 

Observe, entenda as estruturas de classes, a interface, o funcionamento do cliente e do servidor. Depois  comente os códigos explicando detalhadamente seu funcionamento.

 

Interface

 

import java.rmi.*;

public interface InterfaceServidorMat extends Remote
{
    public double soma(double a, double b) throws RemoteException;
    public double subtrai(double a, double b) throws RemoteException;
    public double multiplica(double a, double b) throws RemoteException;
    public double divide(double a, double b) throws RemoteException;
}

 

Classes

 

import java.rmi.*;
import java.rmi.server.*;
public class ServidorMat extends UnicastRemoteObject implements InterfaceServidorMat
{
    public ServidorMat() throws RemoteException
    {
        System.out.println("Novo Servidor instanciado...");
    }
    public double soma(double a, double b) throws RemoteException
    {
        return a+b;
    }
    public double subtrai(double a, double b) throws RemoteException
    {
        return a-b;
    }
    public double multiplica(double a, double b) throws RemoteException
    {
        return a*b;
    }
    public double divide(double a, double b) throws RemoteException
    {
        return a/b;
    }
} 

 

 

Servidor

 

import java.rmi.*;

public class ArrancaServidor
{
    public static void main(String argv[])
    {
        try
        {
            System.out.println("Arrancando servidor...");
            Naming.rebind("ServidorMat_1", new ServidorMat());
        }
        catch (Exception e)
        {
            System.out.println("Ocorreu um problema no arranque do servidor.\n"+e.toString());
        }
    }
}

 

Cliente

 

import java.rmi.*;


public class Cliente
{
        public Cliente()
        {

               System.out.println("Arrancando o Cliente...");
               // Vamos tentar ir aceder ao Servidor de Registos para recolher a interface
               try
               {
                       msi = (InterfaceServidorMat) Naming.lookup("rmi://127.0.0.1/ServidorMat_1");
               }
               catch (Exception e)
               {
                       System.out.println("Falhou o arranque do Cliente.\n"+e);                      
                       System.out.println("Certifique-se que tanto o Servidor de Registos como a Aplicação Servidora estão a correr correctamente.\n");                              
                       System.exit(0);
               }

        }
       

        public double area(double a, double b) throws RemoteException
        {
                return msi.multiplica(a,b);  
        }

        public double perimetro(double a, double b) throws RemoteException
        {
               double metade = msi.soma(a,b);
               return msi.multiplica(2.0,metade);
        }

        public static void main (String[] argv)
        {
               Cliente c = new Cliente();
               try
               {
                       System.out.println("Area: " + c.area(20.0,40.0));
                       System.out.println("Perimetro: " + c.perimetro(20.0,40.0));
               }
               catch (Exception e)
               {
                       System.out.println("Excepção durante chamadas remotas:" +e);
               }
        }

        private InterfaceServidorMat msi; // A interface para o objecto remoto
}