You are on page 1of 40

PROGRAMAO

DISTRIBUDA EM JAVA

Unidade 5
Objetos Distribudos
RMI
Remote Method Invocation
1

Tpicos de Aula

Problema da chamada remota de mtodos


Tecnologia RMI
Interfaces para mtodos remotos
Stubs e Skeletons
Registros de objetos remotos

Chamada remota de mtodos


Servidor remoto

Cliente

PROCESSO

Chamada remota

class ...{
String hello(){
...
}
}

Arquiteturas para chamada remota


RPC ( Remote Procedure Call)
CORBA ( Common Object Request Broker
Architeture)
JAVA RMI ( Remote Method Invocation )

RPC (I)
Estes procedimentos, normalmente, envolvem
servios disponibilizados em redes.
RPC muito utilizado em sistemas
operacionais distribudos para chamada remota
de procedimentos.

RPC (II)
RPC no precisa, necessariamente, envolver
estruturao em termos de objetos.
Tanto o cliente quanto o servidor necessitam de
um Runtime para processamento da RPC.
Existe a necessidade de se trabalhar com
interfaces remotas denominadas STUBS.

CORBA (I)
CORBA uma arquitetura para acesso a
objetos distribudos que prima pela
independncia da plataforma.
A especificao CORBA define, por
exemplo, tipos de dados que podem ser
mapeados para vrias linguagem de
programao, como C++ e Java.

CORBA (II)

Um ponto-chave em CORBA a utilizao de


uma IDL (Linguagem de Definio de Interface).
Vrias
linguagens
(inclusive
Java)
j
disponibilizam mecanismos para mapeamento de
IDL.

CORBA (III)

CORBA exige uma espcie de servidor


especializado chamado ORB (Object
Request Broker). Existem alguns ORBs
comerciais, tal como VisiBroker.

10

Java RMI
Arquitetura de acesso a objetos distribudos
suportada pela linguagem Java.
Em termos de complexidade de programao e
ambiente, muito simples construir aplicaes
RMI, comparando-se com RPC e CORBA.

11

Java RMI

Em termos de ambiente, exige somente


suporte TCP/IP e um servio de nomes de
objetos (rmiregistry), disponilizado
gratuitamente com o JDK/SDK.

12

Arquitetura Java RMI

Na realidade, o RMI uma interface que permite a


intercomunicao entre objetos Java localizados
em diferentes hosts.

13

Arquitetura Java RMI


Cada objeto remoto implementa uma
interface remota que especifica quais de
seus mtodos podem ser invocados
remotamente pelos clientes.
Os clientes invocam tais mtodos
exatamente como invocam mtodos locais.

14

Modelo de Camadas do RMI

15

Interfaces para mtodos remotos(I)


A definio do servio remoto feita atravs
de uma interface Java.

16

Interfaces para mtodos remotos(II)

O primeiro passo para disponibilizar


mtodos que possam ser invocados
remotamente consiste na preparao de uma
interface remota com tais mtodos.

17

Interfaces para mtodos remotos(III)

A construo desta interface pode ser feita


com base na extenso da interface Remote
do pacote java.rmi.

18

Interfaces para mtodos remotos(IV)


A arquitetura RMI suporta duas classes
implementando a mesma interface:
Uma, que implementa o servio e
interpretada no servidor.
Outra, que age como um mecanismo de proxy
e interpretada no cliente.

19

Interfaces para mtodos remotos(V)


Um cliente faz chamadas de mtodos ao objeto
proxy, RMI envia a requisio JVM remota, que
executa o mtodo.

20

Interfaces para mtodos remotos(V)


Valores retornados pelo servio remoto so
enviados, inicialmente, ao objeto proxy, que
os repassa para a aplicao cliente.
Vrios servidores podem implementar de
maneira diferente a mesma interface de
acesso ao servio.

21

Exemplo
Suponha que se queira deixar um mtodo chamado
sayHello(), que devolve uma String, disponibilizado
para chamada remota.
import java.rmi.*;
public interface Hello
extends Remote{
public String sayHello()
throws RemoteException;
}

22

Implementao do mtodo remoto


Cada classe que queira disponibilizar tal
mtodo remoto precisa implementar a
interface especificada anteriormente.
Alm disto, a classe precisa extender a
classe UnicastRemoteObject, que uma
especializao de um servidor remoto
( classe RemoteServer).

23

Exemplo
import java.rmi.*;
import java.rmi.server.*;
import java.net.*;
public class servidor
extends UnicastRemoteObject
implements Hello{
public servidor() throws RemoteException{ // Construtor
super();
}
public String sayHello() throws RemoteException{ // Mtodo remoto
return(Oi cliente);
}

24

Exemplo ( Continuao )
public static void main(String args[]){
try{
servidor serv=new servidor();
Naming.rebind(ServidorHello,serv); // Registra nome do servidor
System.out.println(Servidor remoto pronto.);
}
catch(RemoteException e){
System.out.println(Exceo remota:+e);
}
catch(MalformedURLException e){};
}
}

A partir deste ponto, o objeto chamado ServidorHello est apto a


aceitar chamadas remotas.

25

Compilao e execuo do servidor


No basta apenas compilar e executar o
programa anterior. Toda a compilao e
execuo necessita de um ambiente dado
pela seguinte seqncia:
1. Compilar o arquivo .java
2. Chamar o aplicativo rmic para gerar o Stub e Skel
3. Ativar o controlador de registros (rmiregistry)
4. Chamar o interpretador com o servidor compilado

26

Stubs e Skeletons

O cliente, quando invoca remotamente um


mtodo, no conversa diretamente com o
objeto remoto, mas com uma implementao
da interface remota chamada stub, que
enviada ao cliente.

27

Stubs e Skeletons
O stub, por sua vez, passa a invocao para
a camada de referncia remota.
Esta invocao passada para um skeleton
(esqueleto), que se comunica com o
programa servidor.

28

Compilao do exemplo anterior


servidor.java
javac
servidor.class
rmic
servidor_Stub.class

servidor_Skel.class

29

Execuo do servidor

O primeiro passo antes de executar o servidor


ativar uma espcie de servidor de nomes de
servidores que atendem solicitaes de mtodos
remotos.

30

Execuo do servidor
Isto feito chamando-se o programa
rmiregistry. Este programa pode estar
ouvindo portas especficas, como por
exemplo:
% rmiregistry 2048 &

31

Execuo do servidor

Uma vez que este programa est


executando, pode-se chamar o interpretador
java para o arquivo servidor.class .

32

Programao do cliente
O primeiro passo de implementao de um cliente
que quer invocar remotamente mtodo obter o
stub do servidor remoto.
A localizao deste stub feita com o mtodo
lookup(endereo).
Este mtodo devolve uma referncia remota do
objeto, atravs do envio do stub.

33

Exemplo
import java.rmi.*;
class cliente{
public static void main(String args[]){
try{
Servidor serv= (Servidor) Naming.lookup(rmi://ime.usp.br:2048
/ServidorHello);
String retorno=serv.sayHello();
}
catch(Exception e);
}
}

34

Esquema da chamada
ime.usp.br

cliente

lookup(.../Servidor)
Servidor est aqui

Registry

Solicitao de stub
Stub

Stub

Servidor_Stub.class

sayHello()
Servidor_Skel.class

Oi cliente

Servidor..class

35

Exemplo II ( Calculadora)
Interface
public interface Calculator
extends java.rmi.Remote {
public long add(long a, long b)
throws java.rmi.RemoteException;
public long sub(long a, long b)
throws java.rmi.RemoteException;
public long mul(long a, long b)
throws java.rmi.RemoteException;
public long div(long a, long b)
throws java.rmi.RemoteException;
}

36

Exemplo II ( Calculadora)
Implementao dos mtodos
public class CalculatorImpl
extends java.rmi.server.UnicastRemoteObject
implements Calculator {
public CalculatorImpl()
throws java.rmi.RemoteException {
super();
}
public long add(long a, long b)
throws java.rmi.RemoteException {
return a + b;
}

37

Exemplo II ( Calculadora)
Implementao dos mtodos(II)
public long sub(long a, long b)
throws java.rmi.RemoteException {
return a - b;
}
public long mul(long a, long b)
throws java.rmi.RemoteException {
return a * b;
}
public long div(long a, long b)
throws java.rmi.RemoteException {
return a / b;
}
}

38

Exemplo II ( Calculadora)
Servidor
import java.rmi.Naming;
public class CalculatorServer {
public CalculatorServer() {
try {
Calculator c = new CalculatorImpl();
Naming.rebind(" rmi://jaca.ime.usp.br:1099/ CalculatorService", c);
} catch (Exception e) {
System.out.println("Trouble: " + e);
}
}
public static void main(String args[]) {
new CalculatorServer();
}
}

39

Exemplo II ( Calculadora)
Cliente
import java.rmi.Naming;
public class CalculatorClient {
public static void main(String[] args) {
try {
Calculator c =
Naming.lookup( "rmi://jaca.ime.usp.br:1099/CalculatorService");
System.out.println( c.sub(4, 3) );
System.out.println( c.add(4, 5) );
System.out.println( c.mul(3, 6) );
System.out.println( c.div(9, 3) );
}
catch (Exception e) {
System.out.println(e);
}
}
}

(Calculator)

40

Passagem de parmetros
Quando se passa um parmetro para um
mtodo remoto, pode ocorrer duas situaes:
Tipos primitivos: RMI faz uma cpia do
parmetro e a envia para o servidor.
Objetos: RMI utiliza o mecanismo de
serializao para enviar uma cpia do objeto
para o servidor .

You might also like