You are on page 1of 15

Sistemas Distribudos

Remote Method Invocation


Descrio geral Criao de um servidor RMI Criao de um cliente RMI

Introduo

Sistemas Distribudos

O sistema de Remote Method Invocation da linguagem JAVA, permite invocar mtodos de objectos que esto a correr noutra mquina virtual. O RMI fornece mecanismos para comunicao remota, entre objectos criados na linguagem Java.

m1( String s): int

b1.m1("xpto")
a1 (A)

int

b1 (B)

JVM 1

JVM 2

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

Descrio geral de uma aplicao RMI


Aplicaes RMI so normalmente constitudas por 2 programas:
O servidor
Cria objectos remotos (que sero evocados atravs do sistema RMI). Torna as referncias para estes objectos acessveis. Espera por chamadas dos clientes aos mtodos dos objectos criados.

Sistemas Distribudos

O cliente
Obtm referncias para os objectos remotos a disponibilizados pelo servidor. Evoca os mtodos dos objectos como se estes fossem locais.

O sistema RMI fornece os mecanismos que permite a comunicao entre o cliente e o servidor. Este tipo de aplicaes designam-se normalmente por Aplicaes de Objectos Distribudos ou Aplicaes distribudas.

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

Aplicaes de objectos distribudos

Sistemas Distribudos

Uma aplicao de objectos distribudos suportada sobre RMI tem que:


Localizar os objectos remotos (obter referncias)
Atravs do sistema de nomes do RMI (rmiregistry). Atravs da passagem de referncias para objectos remotos no decorrer das operaes da aplicao.

Carregar os dados (serializao) e o cdigo (bytecodes) dos objectos remotos (carregamento dinmico de cdigo).

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

Interfaces, Objectos e mtodos Remotos

Sistemas Distribudos

semelhana de uma aplicao Java tradicional, uma aplicao distribuda, que usa RMI, constituda por interfaces e classes.
Interfaces definem os mtodos Classes implementam os mtodos definidos nas interfaces e, possivelmente, mtodos adicionais.

Objectos que possuem mtodos que podem ser evocados de outras mquinas virtuais so chamados Objectos Remotos . Os objectos de uma classe tornam-se remotos se esta implementar uma interface remota. Uma interface remota tem as seguintes caractersticas:
Deriva (estende) da interface java.rmi.Remote. Cada mtodo desta interface tem que declarar na clusula de throws a excepo java.rmi.RemoteException, alm das excepes especficas de cada mtodo.

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

Stub e Skeleton classes

Sistemas Distribudos

O sistema RMI trata de forma diferente os objectos remotos dos restantes, quando estes so passados de uma mquina virtual (JVM) para outra.
Objectos no remotos
Enviada uma cpia para a JVM destino.

Objectos remotos
enviado um objecto stub (proxy) para o objecto remoto.

Stub
a referncia local para o objecto remoto. Implementa o mesmo conjunto de interfaces remotas que o objecto remoto.
Pode ser feito uma coero (cast) do objecto stub para qualquer uma das interfaces remotas. Apenas os mtodos definidos nestas interfaces podem ser evocados pelo cliente.

O cliente evoca os mtodos do stub.


Enviam (serializam) os parmetros de entrada de mtodo para um agente existente no servidor (skeleton) , atravs de uma ligao TCPIP Recebem, atravs da ligao com skeleton, os parmetros de retorno, aps este ter evocado o mtodo correspondente do objecto remoto. Retorna os parmetros recebidos ao cliente.

Skeleton
Recebe do stub, os parmetros de entrada do mtodo. Evoca o mtodo do objecto remoto com os parmetros recebidos. Recebe os parmetros de retorno do objecto remoto e retorna-os (serializao) ao stub.

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

Fluxo de dados de uma evocao RMI

Sistemas Distribudos

A B_Stub B_Skel

m1( String s): int

(1)
b1_stub.m1("xpto")
a1 (A)

(2) b1_skel.m1("xpto")
b1_stub (B_Stub)

(3) b1.m1("xpto")
b1_skel (B_Skel)

(6) int

(5) int

(4) int

b1 (B)

JVM 1

JVM 2

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

Gerao de uma aplicao RMI

Sistemas Distribudos

Para gerar uma aplicao distribuda com o RMI, devem ser seguidos os seguintes passos:
1. Definir e implementar os componentes distribudos (remotos)
i. ii. Definir as interfaces remotas. Implementar as classes dos objectos remotos
Estas classes implementam uma ou mais interfaces remotas, e podem implementar outras interfaces (no remotas) que apenas tero visibilidade local. Implementar clientes. Os clientes podem ser implementados a partir do momento que as interfaces remotas estiverem definidas e compiladas.

2.

Compilar as sources e gerar os stubs (rmic)


i. ii. Compilar as sources com a implementao das interfaces remotas (javac). Criar os stubs (stub e skel) para os objectos remotos (rmic). Disponibilizar, atravs de um protocolo de URL, todas as classes necessrias ao cliente.

3. 4. 5.

Disponibilizar as classes necessrias ao cliente.


i.

Implementar cliente. Iniciar a aplicao


i. Iniciar a aplicao de registo de objectos remotos (rmiregistry). ii. Criar os objectos servidores, e regista-los no rmiregistry. iii. Iniciar o cliente.
Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

15-01-2012

Sistemas 1. Definir e implementar componentes distribudos Distribudos i. Definio das interfaces Remotas
package serverInterfaces.remote; import java.rmi.Remote; import java.rmi.RemoteException; import java.math.BigInteger;

public interface Operator extends Remote { BigInteger add(BigInteger b1, BigInteger b2) throws RemoteException; BigInteger subtract(BigInteger b1, BigInteger b2) throws RemoteException; BigInteger divide(BigInteger b1, BigInteger b2) throws RemoteException; BigInteger multiply(BigInteger b1, BigInteger b2) throws RemoteException; }

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

1. Definir e implementar componentes distribudos ii. Implementao das classes Remotas


public class OperatorServer extends UnicastRemoteObject implements Operator { public OperatorServer() throws RemoteException { } public BigInteger add(BigInteger b1, BigInteger b2) throws RemoteException { return b1.add(b2); } public BigInteger subtract(BigInteger b1, BigInteger b2) throws RemoteException { return b1.subtract(b2); } public BigInteger divide(BigInteger b1, BigInteger b2) throws RemoteException { return b1.divide(b2); } public BigInteger multiply(BigInteger b1, BigInteger b2) throws RemoteException { return b1.multiply(b2); } public static void main(String []args) { System.setSecurityManager(new RMISecurityManager()); String name = "//localhost/OperatorServer"; try { OperatorServer os = new OperatorServer(); Naming.rebind(name,os); System.out.println(name + "bound"); } catch (Exception e) { System.err.println("OperatorServer exception: " + e.getMessage()); e.printStackTrace(); } } }

Sistemas Distribudos

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

2. Compilar as sources e gerar os stubs

Sistemas Distribudos

<DIR> . <DIR> .. OperatorServer.class OperatorServer.java OperatorServer_Skel.class OperatorServer_Stub.class java.policy <DIR> serverInterfaces

javac OperatorServer.java C:\OperatorServer> rmic OperatorServer C:\OperatorServer> dir


C:\OperatorServer>

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

3. Disponibilizar as classes necessrias ao cliente

Sistemas Distribudos

As classes stub vo, numa primeira verso, ser disponibilizadas ao servidor atravs do protocolo file na directoria c:\ServerOperator

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

4. Implementao do cliente

Sistemas Distribudos

import import import import

java.rmi.*; serverInterfaces.remote.*; java.math.*; java.lang.*;

public class OperatorClient { public static void main(String args[]) { System.setSecurityManager(new RMISecurityManager()); String name = "//localhost/OperatorServer"; try { Operator o = (Operator)Naming.lookup (name); BigInteger b1 = new BigInteger("1234567"); BigInteger b2 = new BigInteger("1"); BigInteger b3 = o.add(b1, b2); System.out.println("b3: " + b3); } catch( Exception e) { System.out.println(e); e.printStackTrace(); } } }

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

5. Iniciar a aplicao i. rmiregistry



C:\>

Sistemas Distribudos

Esta aplicao o servio onde os objectos remotos se vo registar, e onde os clientes vo pedir referncias para os objectos remotos. Esta aplicao deve ser iniciada sem a varivel de ambiente CLASSPATH definida.

rmiregistry ii. O cdigo de registo do objecto servidor j est implementado no mtodo main da classe dos objecto servidor. C:\> C:\OperatorServer> java Djava.rmi.server.codebase=file:/c:\OperatorServer/ Djava.security.policy=java.policy OperatorServer iii. Iniciar o cliente C:\> C:\OperatorClient> java Djava.security.policy=java.policy OperatorClient
15-01-2012 Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

Ficheiros java.policy

Sistemas Distribudos

Ficheiro java.policy do servidor


grant { permission java.net.SocketPermission "*:1024-", "connect"; };

Ficheiro java.policy do cliente


grant { permission java.net.SocketPermission "*:1024-", "connect"; permission java.io.FilePermission "D:\\OperatorServer\\-", "read"; }

15-01-2012

Nuno Valero Ribeiro Gab. F269 nribeiro@est.ips.pt

You might also like