Professional Documents
Culture Documents
DISTRIBUDA EM JAVA
Unidade 5
Objetos Distribudos
RMI
Remote Method Invocation
1
Tpicos de Aula
Cliente
PROCESSO
Chamada remota
class ...{
String hello(){
...
}
}
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)
CORBA (III)
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
12
13
14
15
16
17
18
19
20
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
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){};
}
}
25
26
Stubs e Skeletons
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
servidor_Skel.class
29
Execuo do servidor
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
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 .