You are on page 1of 48

Java RMI

Licenciatura em Engenharia Informática


3º Ano – 5º Semestre
Ano lectivo 2010-2011

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


1
  Partes destes slides são baseadas em versões
anteriores criadas pelos docentes Pedro António e Mário
Calha, bem como por mim próprio para utilização em
unidades curriculares relacionadas.

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Sumário

  Java RMI
  Introdução
  RPC vs RMI
  Objectivos do Java RMI
  Aplicações RMI
  Arquitectura Java RMI
  Interfaces remotas, Stubs, Esqueletos, Interfaces
remotas e Classes, Localização de Servidores
  Como usar o Java RMI: step-by-step
  Passagem de Parâmetros e Retorno
  Segurança RMI

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


RPC vs Java RMI

  Introdução
  Os Java sockets possibilitam um nível de comunicação muito flexível. No
entanto, é necessário que o cliente e o servidor estabeleçam os
protocolos ao nível da aplicação de modo a codificar e a descodificar as
mensagens.

  Uma alternativa aos sockets são os RPCs, que restringe a comunicação


ao nível da chamada de procedimentos. Fornece a ilusão de uma
chamada de procedimentos locais, mas na realidade os argumentos do
procedimento são empacotados e enviados em mensagens para o
destino remoto.

  RMI é uma versão RPC orientada a objecto, que permite estabelecer


uma comunicação entre objectos existentes em vários espaços de
endereçamento diferentes.

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


RPC vs Java RMI
 Java RMI
  RPC   Orientado ao objecto

  Orientado ao   Dependente da linguagem


procedimento Java
  Independente da   Passagem de objectos por
linguagem valor: serialização
  Uso de tipos simples   Permite mobilidade de código
como parâmetros (é possível o carregamento de
  Ponteiros requerem
classes remotas)
um tratamento   Referências locais e remotas
especial são manipuladas
  Não permite
automaticamente
mobilidade de código   Seguro (são fornecidos
gestores de segurança)

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Java RMI: Principais Objectivos

  Integrar o modelo de objectos distribuídos no Java de modo


natural
  Invocação remota de objectos em máquinas virtuais
diferentes, usando a mesma sintaxe que as invocações locais

Invocação Local
OperacoesMat obj=new OperacoesMat();
System.out.println("O produto de 100 com 10 é: "+obj.produto(100, 10));

Invocação Remota
OperacoesMat obj=(OperacoesMat)Naming.lookup("//127.0.0.1/OpMath");
System.out.println("O produto de 100 com 10 é: "+obj.produto(100, 10));

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Java RMI: Principais Objectivos

  Tornar a programação de aplicações distribuídas o mais simples possível


– as interfaces remotas são escritas em Java e o código das
comunicações (os stubs) é gerado automaticamente
import java.rmi.Remote;import java.rmi.RemoteException;
public interface OperacoesMat extends Remote {
public double produto(double a,double b) throws RemoteException;
public double soma(double a,double b) throws RemoteException;
public double divisao(double a,double b) throws RemoteException;
public double subtraccao(double a, double b) throws RemoteException;
}

  Suportar vários tipos de referências para objectos remotos:


  Referências não persistentes ou referências vivas.
  Referências persistentes.
  Activação lenta (lazy activation)
  Manter o ambiente seguro da plataforma Java oferecida por gestores de
segurança e pelos class loaders.

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Terminologia RMI

  Um objecto remoto é um objecto cujos métodos podem ser


invocados a partir de máquina virtual Java remota.
  Um objecto remoto é descrito por uma ou mais interfaces remotas.
  As interfaces remotas são escritas em Java e declaram os métodos
do objecto remoto.
  A invocação de um método remoto (RMI) é a acção de invocar um
método de uma interface remota de um objecto remoto.
  A invocação de um método de um objecto remoto tem a mesma
sintaxe que a invocação de um método de um objecto local.

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Visão Geral das Aplicações Java RMI (1)

  Numa invocação RMI estão envolvidos três processos:


  Servidor RMI (É o processo que aloja/gere os objectos remotos)
  Cria objectos remotos, torna acessíveis as referências para estes e
espera que os clientes invoquem métodos sobre estes objectos
remotos.

  Cliente RMI (É o processo que invoca métodos remotos)


  Um cliente obtém as referência do(s) objecto remoto(s) e invoca
métodos sobre este(s).

  Binder ou Object Registry, chamado rmiregistry (Servidor de


identificação onde todos os objectos remotos devem ser registados).
  Os objectos são registados sob um nome único (a usar pelos
clientes).
  O servidor de identificação RMI é um objecto (servidor) remoto que
oferece um serviço de directório aos clientes RMI, i.e., é usado para
obter acesso aos objectos remotos conhecendo os seus nomes.

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Visão Geral das Aplicações Java RMI (2)
  Aplicações RMI necessitam de:
  1- Localizar os objectos remotos (registar os objectos
remotos de uma aplicação com o utilitário rmiregistry
ou passar e retornar referências de objectos
remotos).

  2- Comunicar com objectos remotos (detalhes


tratados pelo RMI)

  3- Carregar classes dos objectos que são passadas


como parâmetros ou valores retornados (o RMI
fornece os mecanismos necessários para carregar o
código de um objecto assim como transmitir os seus
dados).

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Visão Geral das Aplicações Java RMI (3)

  Exemplo (de utilização do RMI registry para obter uma referência


para um objecto remoto)
1.  O servidor regista o objecto no RMI Registry (associa a este um
nome).
2.  O cliente obtém a referência do objecto passando o seu nome ao
RMI Registry.
3.  O cliente invoca um método sobre o objecto remoto.

RMI RMI Registry

2) RMI
Cliente RMI 1)
3)
RMI Servidor
RMI

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Arquitectura de Camadas Java RMI
  Trata-se uma arquitectura composta por três níveis/camadas
independentes
  1º Nível – Stub/skeleton
  2º Nível – RRL (Remote Reference Layer)
  3º Nível – Transporte

Cliente RMI Servidor RMI 1º Nível


Stubs Skeletons

NRR NRR 2º Nível


JRMP
Transporte Transporte
3º Nível
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011
Arquitectura Java RMI

  1º Nível – Stub/skeleton: Oferecem as interfaces que os objectos da


aplicação usam para interagir entre si.
  Estes são elementos intermediários responsáveis pelas comunicações:
efectuam o marshaling e unmarshaling dos dados para transmissão ou
recepção para/da camada Remote Reference Layer.
  O stub é a entidade que representa o objecto RMI no lado cliente – é o
procurador (i.e., o proxy) do objecto remoto.
  O skeleton é a entidade no lado servidor que recebe os pedidos de
invocação de métodos enviados pelos stubs, fala com os objectos
remotos e devolve a resposta ao stub do cliente.

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Arquitectura Java RMI

  2º Nível – RRL (Remote Reference Layer)


  O RRL é o middleware entre os stubs/skeletons e a camada de
transporte.
  Cria e gere as referências dos objectos remotos.
  É responsável pela gestão da actividade dos objectos remotos (e.g.,
activação dos objectos remotos guardados em disco).
  Tem também a função da gestão das comunicações entre os clientes e
servidores com as JVM’s para objectos remotos.

  3º Nível – Transporte: Responsável pela comunicação entre cliente e


servidor RMI.
  Utiliza o protocolo JRMP (Java Remote Method Protocol) sobre o TCP/IP.
  O JRMP utiliza diversas mensagens, entre pedidos e confirmações, para
permitir que os objectos comuniquem entre si.
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011
Stubs & Skeletons (1)

  Os stubs escondem das aplicações os detalhes de implementação


envolvidos nas comunicações entre o cliente e o servidor RMI
  Um stub de um objecto remoto actua como o representante local ou
procurador (proxy) do objecto remoto.
  Quem efectua a chamada invoca o método sobre o stub local, que é
responsável por transportá-la para a chamada do método no objecto
remoto.
  As responsabilidades dos stubs são (semelhantes às dos stubs RPC):
  Inicia as chamadas remotas com a JVM que contém o objecto remoto
  Marshalling dos argumentos a serem enviados para a JVM remota sob a forma
de uma stream
  Informa a RRL que deve ser iniciada uma chamada sobre o servidor RMI
  Unmarshalling dos resultados (ou excepções) e retorna-os a quem efectuou a
chamada
  Informa a RRL que a chamada está completa

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Stubs & Skeletons (2)

  Na JVM remota cada objecto remoto pode ter um skeleton


correspondente.
  O skeleton é responsável de encaminhar (dispatch) a chamada para a
implementação actual do objecto remoto.
  Um skeleton recebe uma invocação de um método:
  Unmarshals (leitura) dos parâmetros recebido através da stream para o método
remoto.
  Invoca o método existente na implementação actual do objecto remoto.
  Marshals (escrita e envio) do resultado (valor ou excepção) para quem efectuou
a chamada sob a forma de uma stream.
  Os stubs e skeletons não são escritos pelo programados! Estes são gerados pelo
compilador de interfaces remotas, rmic . Exemplo de geração dos ficheiros com os
stubs e skeletons:
ContaBancoImpl_Stub.class
rmic ContaBancoImpl
saída ContaBancoImpl_Skell.class

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Localização de Servidores:
RMI Registry
  Um rmiregistry é um processo executado na mesma máquina que o servidor
RMI
  Fornece um serviço de Identificação e localização de objectos RMI
  Registo de objectos RMI por nome, isto é, permite que os servidores RMI associem
nomes aos objectos RMI
  Posteriormente, através de um rmiregistry os clientes na máquina local ao servidor
RMI ou em máquinas remotas podem procurar/localizar os objectos remotos e realizar
invocações de métodos remotos
[Dado o nome do objecto, sob a forma de um URL, devolve a sua referência a qual
permite efectuar RMIs sobre objectos RMI]
  O URL (Uniform Resource Locator) tem o seguinte formato (java.lang.String):
  //host:port/name ou rmi://host:port/name
  Host – máquina remota ou local onde está o registry.
  Port – é o número do porto onde o registry aceita as chamadas (1099 – default).
  Name – é uma simples String que não é interpretada pelo registry.

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Localização de Servidores:
RMI Registry

  Visão simplificada

Cliente RMI
Servidor RMI

lookup bind
(”impressora") (”impressora")
Rmiregistry

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Registo de Objectos Remotos Java
– Classe de Suporte
  java.rmi.Naming
  Funciona sobre serviço de registo de objectos remotos, rmiregistry
  Fornece os métodos URL (Uniform Resource Locator) para que as
referências de um objecto remoto possam:
  Ser armazenadas no rmiregistry
  Ser obtidas pelos clientes RMI, para este poderem invocar
métodos
  Métodos disponíveis:
  Permite procurar um objecto remoto a partir de qualquer
máquina (lookup)
  Permite associar um nome a um objecto remoto (bind)
  Permite re-associar um nome a um objecto remoto (rebind)
  Permite remover a associação de um nome com um objecto
remoto (unbind)
  Permite listar os URLs existentes no serviço de registo de
objectos remotos (list)
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011
Visão Detalhada: Fluxo RMI

Máquina Virtual do Cliente RMI Máquina Virtual do Servidor RMI

Cliente RMI 1. O Servidor RMI cria um Objecto


objecto remoto Remoto
2. O servidor regista o
objecto 1

Skeleton
Stub
Servidor RMI

“João”

Alexandre Fonte Máquina virtual dodermiregistry


Material Apoio a AD, ESTCB Edição 2010-2011
Visão Detalhada: Fluxo RMI

Máquina Virtual do Cliente RMI Máquina Virtual do Servidor RMI

Cliente RMI Objecto


3. O cliente contacta o rmiregistry Remoto
4. O rmiregistry devolve a referência remota
(o stub é criado) 1

Skeleton
Stub
Servidor RMI
3 4

“João”

Alexandre Fonte Máquina virtual dodermiregistry


Material Apoio a AD, ESTCB Edição 2010-2011
Visão Detalhada: Fluxo RMI

Máquina Virtual do Cliente RMI Máquina Virtual do Servidor RMI

Cliente RMI 5. O cliente invoca um método (sobre o stub) Objecto


6. O Stub contacta o skeleton
7. O skeleton invoca o método sobre Remoto
o objecto remoto
5 7
1
6
Skeleton
Stub
Servidor RMI
3 4

“João”

Alexandre Fonte Máquina virtual dodermiregistry


Material Apoio a AD, ESTCB Edição 2010-2011
Interface Remota
  Uma Interface Remota define a “Interface de
comunicação” entre o Cliente RMI e o Servidor RMI
  Uma interface remota extende a interface
java.rmi.Remote
  Ambos os objectos remotos e stubs implementam a interface remota,
de forma que os clientes RMI e o esqueletos observam a mesma
“fachada”
  Declara os métodos que são acessíveis remotamente
  Todos devem declarar que provocam excepções remotas (throws
RemoteException)
  Exemplo de uma interface java.rmi.Remote:
public interface ContaBanco extends java.rmi.Remote {
public void deposito(float valor)
throws java.rmi.RemoteException;
public void levantamento(float valor)
throws java.rmi.RemoteException;
public float consultaSaldo()
throws java.rmi.RemoteException;
}
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011
Interfaces Remotas & Stubs
  Em Java RMI, um stub de um objecto remoto implementa o mesmo
conjunto de interfaces remotas que o objecto remoto implementa.

Interface Remota

Implementa Implementa

Cliente RMI Stub Skeleton Servidor RMI

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Classes e Interfaces remotas Java RMI
(1)
  As classes e as interfaces responsáveis por especificar o comportamento de um
sistema RMI estão definidas no package java.rmi.
  Relações entre a interface java.rmi.Remote e classes:

Interfaces Classes

Remote RemoteObject IOException

RemoteServer RemoteException

UnicastRemoteObject

  A interface java.rmi.Remote é uma interface que declara um conjunto de


métodos base que podem ser invocados a partir de uma máquina virtual Java
remota.
  Uma interface remota é definida através da extensão da extend
java.rmi.Remote.
  A classe RemoteObject implementa a interface java.rmi.Remote, enquanto as
restantes extendem a funcionalidade desta.
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011
Classes e Interfaces remotas Java
RMI (3)

  Classe RemoteException:
  É a super-classe das excepções geradas pelo runtime RMI durante a
invocação de métodos remotos.
  Esta excepção é gerada quando ocorre uma falha na invocação remota
dos métodos:
  Falhas na comunicação.

  Falhas durante o processos de marshalling e unmarshalling.

  Erros de protocolo.

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


A classe RemoteObject
  As funções servidor RMI são fornecidas por
java.rmi.server.RemoteObject e as suas subclasses:
  java.rmi.server.RemoteServer
  java.rmi.server.UnicastRemoteObject
  (Existem outras)
  A classe RemoteObject fornece a implementação de métodos
java.lang.Object necessários a objectos remotos (toString(), equals
(), ...).
  A classe UnicastRemoteObject possui os métodos necessários à
criação de objectos remotos

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Como usar o Java RMI: step-by-step

1.  Definir a interface remota


2.  Implementar os objectos remotos
3.  Implementar o servidor remoto
4.  Implementar o cliente
5.  Compilar as classes remotas
6.  Compilar e distribuir o cliente
7.  Lançar o RMI registry
8.  Lançar o cliente e o servidor

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Como usar o Java RMI?
Definir a(s) interface(s)
remota(s)

(InterfaceObj.java)

Implementar os Obj. Implementar o


remotos Servidor remoto

(InterfaceObjImpl.java) (Servidor.java)

Implementar o
Cliente Javac

(InterfaceObjImpl.class)

Javac Skeleton.class Servidor.class


rmic

Cliente.class Stub.class Lançar rmiregistry

Lançar Cliente Lançar Servidor


Java Cliente Java Servidor

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


1 – Definir a Interface remota

  Num ficheiro à parte com nome idêntico à da interface e extensão .java


  Importar o pacote java.rmi: import java.rmi.*
  Usar a palavra chave interface para iniciar a especificação da interface remota
  Esta deve ser public

  A interface remota deve sempre extender ( extends ) a interface java.rmi.Remote;


  Declarar na interface remota todos os métodos que são acessiveis remotamente /que
podem ser invocados sobre os objectos remotos.
  A declaração de cada método deve incluir as excepções (na cláusula throws)
java.rmi.RemoteException.

public interface ContaBanco extends java.rmi.Remote {


public void deposito(float valor) throws java.rmi.RemoteException;
public void levantamento(float valor) throws java.rmi.RemoteException;
public float consultaSaldo() throws java.rmi.RemoteException;
}

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


2 - Implementar os objectos
remotos
  Novamente num ficheiro à parte, agora com o nome do objecto
remoto e extensão .java
  Todo o objecto java RMI é uma instância de uma classe que
extends java.rmi.server.UnicastRemoteObject que implementa a
interface remota

public class OperacoesMatImpl extends UnicastRemoteObject implements OperacoesMat


{
}

  Esta classe pode implementar várias interfaces remotas


  Esta classe pode definir métodos que não aparecem na interface
remota, contudo estes não serão acessiveis aos clientes remotos
  Todos os métodos devem declarar java.rmi.RemoteException,
mesmo o constructor mesmo que vazio.

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


2 - Implementar os objectos
remotos
  Exemplo da implementação de uma Interface Remota
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class ContaBancoImpl extends UnicastRemoteObject implements ContaBanco {
private float saldo = 0.0f;
public ContaBancoImpl(float saldoInicial) throws RemoteException {
saldo = saldoInicial;
}
public void deposito(float valor) throws RemoteException {
saldo += valor;
}
public void levantamento(float valor) throws RemoteException {
saldo -= valor;
}
public float consultaSaldo() throws RemoteException {
return saldo;
}
}

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


3 - Implementar o servidor
remoto (1)
  Num ficheiro à parte criar uma classe com método main()
  Esta classe tem que primeiro instanciar os objectos RMI
  Depois, tem que efectuar o registo destes objectos, com um nome,
no RMI Registry
  Usar a classe java.rmi.Naming, método bind() ou o método rebind()
  E é tudo!

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


3 - Implementar o servidor remoto (2)
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class ServidorContaBanco extends UnicastRemoteObject implements ContaBanco
{
public static void main(String [] args) {
System.setSecurityManager(new RMISecurityManager()); // install RMI security manager
try {
String name = args[0]; // name with which we can find it = user name
ContaBancoImpl serv = new ContaBancoImpl(250.0f); //cria uma nova instância,
saldo inicial 250Euros
Naming.rebind(name,serv); // registo com o servidor de nomes
System.out.println( Servidor ContaBancoImpl lançado, registado como ,+name);
} catch(Exception e) {
System.out.println( Erro no arranque do servidor while registering: " + e);
System.exit(-1);
}
}
}

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


4 – Implementar o cliente

  O cliente terá que localizar os objectos RMI


  Usar a classe java.rmi.Naming, método lookup(nome do objecto)
  Esta dado o nome do objecto devolve uma referência
  Fazer um cast da referência para a interface remota e invocar os
métodos remotos
import java.rmi.*;
public class ClienteContaBanco {
public static void main(String[] args) {
String name=args[0];
try{
ContaBanco obj = (ContaBanco) Naming.lookup(name);
} catch (Exception e) {
System.out.println( Erro enquanto localizava o servidor ,+e); System.exit(-1);}
try{ //RMI – Remote Invocation Method
System.out.println("Saldo: " + obj.consultaSaldo());
} catch(Exception e) {
System.out.println( Erro enquanto consultava o saldo ,+e);
System.exit(-1)
}
}}

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


5 – Compilar as classes remotas

  Compilar todas as classes para implementar as interfaces remotas e


o servidor
  Usar o comando javac
  Lê ficheiros .java
  Produz ficheiros .class
  Gerar os stubs e skeletons com o rmic (remote interface compiler)
  Usar o comando rmic
  Lê o ficheiro .class das implementações dos objectos
  Produz _Stub.class e _Skell.class
javac ContaBanco.java
javac ContaBancoImpl.java
rmic ContaBancoImpl
javac ServidorContaBanco

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Compilando as classes remotas
(Diagrama)

javac
ContaBanco.java ContaBanco.class

(Interface) (ficheiro class da Interface)

javac rmic ContaBancoImpl_Stub.class


ContaBancoImpl.java ContaBancoImpl.class ContaBancoImpl_Skell.class

O compilador rmic toma com entrada a


classe que implementa as interface remotas
O
e gera as classes dos stubs e esqueletos Em versões mais
recentes do Java RMI
É apenas gerada uma
única classe

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


6- Compilar e Distribuir o cliente

  Compilar a classe do cliente


  javac ContaCliente

  Distribuir o cliente RMI pelas máquinas cliente


  As classes cliente RMI
  Os stubs RMI
  Os interfaces

E.g., Uso de um servidor WEB


cp ContaCliente.class ContaBancoImpl_Stub.class Interface.class /
public_html

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Passos finais …
  7 - Lançar o RMI registry
  Usar o comando rmiregistry que inicia um registo de objectos remotos java
numa determinada porta na máquina local; A porta por omissão do
rmiregistry é a 1099. Para um porto diferente indicar o respectivo número
como.
  No MS Windows

  Start rmiregistry ou start rmiregistry <novo porto> (e.g. start

rmiregistry 6234)
  No Linux/Unix

  rmiregistry & ou start rmiregistry <novo porto> (e.g. start

rmiregistry 6234)
  8 - Lançar o servidor e o cliente RMI
  No directório das classes do servidor usar o comando java
  java ServidorContaBanco
  Lado Cliente
  java ClienteContaBanco <name>
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011
Passagem de Parâmetros e Retorno
  Em Java RMI os parâmetros de um método são
assumidos como parâmetros de entrada
  não é necessário especificar a direcção

  O resultado de um método é visto como uma

parâmetro de saída
  Regra geral, todo o objecto serializable – i.e., que

implementa a interface serializable pode ser passado


como parâmetros ou retorno
  Regra geral, todos os tipos primitivos e objectos

remotos são serializable


  As classes são carregadas automaticamente para o

destinatário pelo sistema RMI sempre que necessário


Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011
Mais sobre …
Serialização de Objectos Java
  O mecanismo de serialização de Objectos Java permite
guardar o estado (os dados) de instâncias de objectos

  Os objectos serializable são convertidos numa


sequência de bytes (stream)

  Os objectos serializados são re-criados na memória da


máquina virtual remota e disponibilizados para o
programa Java remoto

  Não é necessário escrever código particular! Basta os


objectos implementarem a interface java.io.Serializable

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Passagem de Parâmetros Primitivos

  Um tipo de dados primitivo é passado por valor


  O RMI copia o tipo de dados primitivo e envia-o para o
método remoto
  Se um método retornar um tipo de dados primitivo, este
valor é retornado por valor à máquina virtual que
originou a chamada do método
  Os valores são passados entre JVMs de uma forma
normalizada, independente da plataforma, permitindo a
comunicação entre plataformas diferentes com
fiabilidade

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Passagem de Objectos
Não Remotos
  Regra geral, ao passar um objecto para um método
remoto, o RMI envia o próprio objecto e não a sua
referência (entre JVMs)

  O objecto não remoto é passado por valor! Não a


referência do objecto; O objecto não remoto é duplicado.

  O retorno de um objecto por um método remoto implica a


cópia de todo o objecto para o programa que efectou a
chamada ao método remoto

  O RMI utiliza a tecnologia da Serialização de Objectos Java


para transformar um objecto num formato linear para ser
transmitido na rede
Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011
Passagem de Objectos
Remotos

  Neste caso o que é passado é a referência remota do


Objecto remoto

  Neste caso é feita a cópia da referência do objecto


remotos para o programa que efectou a chamada ao
método remoto.

  Quando for recebida a referência remota o que acontece é


pode-se efectuar novas invocações RMI

  Estes na práctica são subtituídos por stubs, dando a ideia


da passagem por referência

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Segurança do Carregamento de Código

  O RMI adere usa os mecanismos de segurança do Java


  Qualquer código a carregar é através do carregador de classes do
Java (o class loader) e é sempre executado sob uma política de
segurança
  O servidor ou stubs podem ser maldosos
  rmic está OK, mas alguém manipulou o código do stub tornando-o maldoso
(tornando-o num evil stub): afinal de contas o stub é apenas um ficheiro .class
  Um Security Manager deve estar presente para proteger o cliente
destes stubs durante o carregamento do código.
  No inicio do programa basta adicionar a linha seguinte (além de:
import java.rmi.RMISecurityManager)

if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Segurança do Carregamento de Código
  É também preciso criar um ficheiro texto com a politica de acesso
remoto
  Define um conjunto de permissões disponíveis para o código
  Cada permissão define um acesso a um recurso (e.g., permissão
leitura escrita num directório especifico ou permissão para se ligar
numa máquina particular)

Ficheiro security.policy
grant {
permission java.security.AllPermission;
// Other options:
// permission java.net.SocketPermission "127.0.0.1:1024-", "accept, connect, listen, resolve";
// permission java.net.SocketPermission "localhost:1024-", "accept, connect, listen, resolve”;
// permission java.net.SocketPermission "*:1024-65535", "connect,accept";
// permission java.net.SocketPermission "*:80", "connect”;
// permission java.net.SocketPermission "*:1024-65535", "connect,accept";
// permission java.io.FilePermission "c:\\home\\ann\\public_html\\classes\\-", "read";
// permission java.io.FilePermission "c:\\home\\jones\\public_html\\classes\\-", "read";
};

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


Ficheiro security.policy
  Consiste num número de entradas que começam pela
instrução grant
  Cada entrada descreve as permissões associadas a uma
dada operação

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011


47
Segurança do Carregamento de Código

  O arranque dos programas cliente e servidor é também


agora um pouco diferente:
  Cliente:
  java -Djava.rmi.server.codebase=http//servidor/
-Djava.security.policy=../policies/
security.policy cliente
  Servidor:
  java -Djava.rmi.server.codebase=http//servidor/
-Djava.security.policy=../policies/
security.policy servidor

Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011