Vous êtes sur la page 1sur 40

1

PROGRAMAO
DISTRIBUDA EM JAVA

Unidade 5
Objetos Distribudos
RMI
Remote Method Invocation
2
Tpicos de Aula

Problema da chamada remota de mtodos
Tecnologia RMI
Interfaces para mtodos remotos
Stubs e Skeletons
Registros de objetos remotos
3
Chamada remota de mtodos
class ...{
String hello(){
...
}
}
PROCESSO
Chamada remota
Cliente
Servidor remoto
4
Arquiteturas para chamada remota

RPC ( Remote Procedure Call)

CORBA ( Common Object Request Broker
Architeture)

JAVA RMI ( Remote Method Invocation )
5
RPC (I)
Estes procedimentos, normalmente,
envolvem servios disponibilizados em
redes.

RPC muito utilizado em sistemas
operacionais distribudos para chamada
remota de procedimentos.


6
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.

7
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.

8
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.

9
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.
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.

11
12
Arquitetura Java RMI


Na realidade, o RMI uma interface que permite a
intercomunicao entre objetos Java localizados
em diferentes hosts.

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.

13
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.


Interfaces para mtodos remotos(III)


A construo desta interface pode ser feita
com base na extenso da interface Remote
do pacote java.rmi.
17
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.


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.

27
28
Compilao do exemplo anterior
servidor.java
servidor.class
servidor_Stub.class servidor_Skel.class
javac
rmic
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.


Execuo do servidor
30

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


Execuo do servidor


Uma vez que este programa est
executando, pode-se chamar o interpretador
java para o arquivo servidor.class .
31
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
Registry
Servidor_Stub.class
Servidor_Skel.class
Servidor..class
cliente
Stub
lookup(.../Servidor)
Servidor est aqui
Solicitao de stub
Stub
sayHello()
Oi cliente
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 =
(Calculator) 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);
}
}
}
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 .

Vous aimerez peut-être aussi