Ad Cap6 Javarmi

48
 Alexandre Fonte Material de Apoio a AD, ESTCB Edição 2010-2011 1 Java RMI Licenciatura em Engenharia Informática 3º Ano – 5º Semestre Ano lectivo 2010-2011

Transcript of Ad Cap6 Javarmi

Page 1: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 1/48

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

Java RMI

Licenciatura em Engenharia Informática3º Ano – 5º SemestreAno lectivo 2010-2011

Page 2: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 2/48

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

Partes destes slides são baseadas em versõesanteriores criadas pelos docentes Pedro António e MárioCalha, bem como por mim próprio para utilização emunidades curriculares relacionadas.

Page 3: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 3/48

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

Java RMI Introdução RPC vs RMI Objectivos do Java RMI Aplicações RMI Arquitectura Java RMI Interfaces remotas, Stubs, Esqueletos, Interfacesremotas e Classes, Localização de Servidores

Como usar o Java RMI: step-by-step Passagem de Parâmetros e Retorno Segurança RMI

Sumário

Page 4: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 4/48

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

Introdução Os Javasocketspossibilitam um nível de comunicação muito flexível. No

entanto, é necessário que o cliente e o servidor estabeleçam osprotocolos ao nível da aplicaçãode modo a codificar e a descodificar asmensagens.

Umaalternativaaos sockets são osRPCs, que restringe a comunicaçãoao nível da chamada de procedimentos. Fornece a ilusão de umachamada de procedimentos locais, mas na realidade os argumentos doprocedimento são empacotados e enviados em mensagens para odestino remoto.

RMI é uma versão RPC orientada a objecto, que permite estabeleceruma comunicação entre objectos existentes em vários espaços deendereçamento diferentes.

RPC vs Java RMI

Page 5: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 5/48

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

RPC vs Java RMI

RPC Orientado aoprocedimento

Independente dalinguagem

Uso de tipos simplescomo parâmetros

Ponteiros requeremum tratamentoespecial

Não permitemobilidade de código

Java RMI Orientado ao objecto Dependente da linguagemJava

Passagem de objectos porvalor: serialização

Permite mobilidade de código(é possível o carregamento declasses remotas)

Referências locais e remotassão manipuladasautomaticamente

Seguro (são fornecidosgestores de segurança)

Page 6: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 6/48

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 modonatural

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

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

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

Invocação Local

Invocação Remota

Page 7: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 7/48

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 dascomunicações (os stubs) é gerado automaticamente

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 desegurança e pelosclass loaders .

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;}

Page 8: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 8/48

Page 9: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 9/48

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 eespera que os clientes invoquem métodos sobre estes objectosremotos.

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 deidentificação onde todos os objectos remotos devem ser registados).

Os objectos são registados sob umnome único (a usar pelosclientes).

O servidor de identificação RMI é um objecto (servidor) remoto queoferece um serviço de directório aos clientes RMI, i.e., é usado paraobter acesso aos objectos remotos conhecendo os seus nomes.

Page 10: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 10/48

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

Aplicações RMI necessitam de: 1- Localizar os objectos remotos (registar os objectosremotos de uma aplicação com o utilitáriormiregistry ou passar e retornar referências de objectosremotos).

2- Comunicar com objectos remotos (detalhestratados pelo RMI)

3- Carregar classes dos objectos que são passadascomo parâmetros ou valores retornados (o RMIfornece os mecanismos necessários para carregar ocódigo de um objecto assim como transmitir os seusdados).

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

Page 11: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 11/48

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

Exemplo (de utilização do RMI registry para obter uma referênciapara um objecto remoto)

1. O servidor regista o objecto no RMI Registry (associa a este umnome).

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.

Cliente RMI

ServidorRMI

RMI RegistryRMI

RMI

RMI1)2)

3)

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

Page 12: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 12/48

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

Cliente RMI

Stubs

NRR

Skeletons

Servidor RMI

NRR

Transporte Transporte

1º Nível

2º Nível

3º Nível

Arquitectura de Camadas Java RMI

Trata-se uma arquitectura composta por três níveis/camadasindependentes

1º Nível – Stub/skeleton 2º Nível – RRL (Remote Reference Layer) 3º Nível – Transporte

JRMP

Page 13: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 13/48

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 daaplicaçã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 ourecepção para/da camada Remote Reference Layer.

O stub é a entidade que representa o objecto RMI no lado cliente – é oprocurador (i.e., o proxy) do objecto remoto.

O skeleton é a entidade no lado servidor que recebe os pedidos deinvocação de métodos enviados pelos stubs, fala com os objectosremotos e devolve a resposta ao stub do cliente.

Page 14: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 14/48

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.

Page 15: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 15/48

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

Stubs & Skeletons (1)

Osstubs escondem das aplicações os detalhes de implementaçãoenvolvidos nas comunicações entre o cliente e o servidor RMI

Umstub de um objecto remoto actua como o representante local ouprocurador (proxy) do objecto remoto.

Quem efectua a chamada invoca o método sobre ostub local, que éresponsável por transportá-la para a chamada do método no objectoremoto.

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 achamada Informa a RRL que a chamada está completa

Page 16: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 16/48

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

Stubs & Skeletons (2)

Na JVM remota cada objecto remoto pode ter umskeleton correspondente.

Oskeletoné responsável de encaminhar (dispatch ) a chamada para aimplementação actual do objecto remoto.

Umskeletonrecebe 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 osstubs e skeletons:

rmic ContaBancoImpl

ContaBancoImpl_Stub.classContaBancoImpl_Skell.classsaída

Page 17: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 17/48

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

Localização de Servidores:RMI Registry

Umrmiregistryé um processo executado na mesma máquina que o servidorRMI

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 realizarinvocaçõ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/nameou rmi://host:port/name Host– máquina remota ou local onde está oregistry . Port– é o número do porto onde oregistry aceita as chamadas (1099 –default ). Name– é uma simplesString que não é interpretada peloregistry .

Page 18: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 18/48

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

Localização de Servidores:RMI Registry

Visão simplificada

Rmiregistrylookup(”impressora")

bind(”impressora")

Cliente RMI Servidor RMI

Page 19: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 19/48

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 qualquermá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 objectoremoto (unbind) Permite listar os URLs existentes no serviço de registo deobjectos remotos (list)

Page 20: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 20/48

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

Visão Detalhada: Fluxo RMI

Máquina Virtual do Cliente RMI

Cliente RMI

Máquina Virtual do Servidor RMI

Stub

ObjectoRemoto

Skeleton

Máquina virtual do rmiregistry

“João”

Servidor RMI

1

2

1. O Servidor RMI cria umobjecto remoto2. O servidor regista o

objecto

Page 21: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 21/48

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

Visão Detalhada: Fluxo RMI

Máquina Virtual do Cliente RMI

Cliente RMI

Máquina Virtual do Servidor RMI

Stub

ObjectoRemoto

Skeleton

Máquina virtual do rmiregistry

“João”

Servidor RMI

1

2

3 4

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

Page 22: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 22/48

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

Visão Detalhada: Fluxo RMI

Máquina Virtual do Cliente RMI

Cliente RMI

Máquina Virtual do Servidor RMI

Stub

ObjectoRemoto

Skeleton

Máquina virtual do rmiregistry

“João”

Servidor RMI

1

2

3 4

6

5. O cliente invoca um método (sobre o stub)6. O Stub contacta o skeleton7. O skeleton invoca o método sobreo objecto remoto

5 7

Page 23: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 23/48

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

Interface Remota

Uma Interface Remota define a “Interface decomunicaçã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 (throwsRemoteException)

Exemplo de uma interfacejava.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 ;

}

Page 24: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 24/48

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

Interfaces Remotas & Stubs

Cliente RMI SkeletonStub Servidor RMI

Interface Remota

Implementa Implementa

Em Java RMI, umstub de um objecto remoto implementa o mesmoconjunto de interfaces remotas que o objecto remoto implementa.

Page 25: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 25/48

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 umsistema RMI estão definidas no packagejava.rmi. Relações entre a interfacejava.rmi.Remotee classes:

A interfacejava.rmi.Remote éuma interface que declara um conjunto demétodos base que podem ser invocados a partir de uma máquina virtual Javaremota.

Uma interface remota é definida através da extensão daextend java.rmi.Remote.

A classe RemoteObject implementa a interface java.rmi.Remote, enquanto asrestantes extendem a funcionalidade desta.

Remote RemoteObject IOException

RemoteServer RemoteException

UnicastRemoteObject

Interfaces Classes

Page 26: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 26/48

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

ClasseRemoteException: É a super-classe das excepções geradas peloruntime 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 demarshalling e unmarshalling . Erros de protocolo.

Classes e Interfaces remotas JavaRMI (3)

Page 27: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 27/48

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.RemoteObjecte as suas subclasses: java.rmi.server.RemoteServer java.rmi.server.UnicastRemoteObject (Existem outras)

A classeRemoteObjectfornece a implementação de métodosjava.lang.Objectnecessários a objectos remotos (toString(), equals(), ...).

A classeUnicastRemoteObjectpossui os métodos necessários àcriação de objectos remotos

Page 28: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 28/48

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

Como usar o Java RMI: step-by-step

1. Definir a interface remota2. Implementar os objectos remotos3. Implementar o servidor remoto4. Implementar o cliente5. Compilar as classes remotas6. Compilar e distribuir o cliente7. Lançar o RMI registry8. Lançar o cliente e o servidor

Page 29: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 29/48

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

Como usar o Java RMI?

Definir a(s) interface(s)remota(s)

Implementar os Obj.remotos

Javac

(InterfaceObj.java)

(InterfaceObjImpl.java)

rmic

Implementar oServidor remoto

(Servidor.java)

Implementar oCliente

Servidor.classkeleton.classavac

Lançar rmiregistry

Lançar ServidorJava Servidor

Cliente.class

Lançar ClienteJava Cliente

Stub.class

(InterfaceObjImpl.class)

Page 30: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 30/48

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 chaveinterfacepara iniciar a especificação da interface remota

Esta deve serpublic A interface remota deve sempre extender (extends ) a interfacejava.rmi.Remote; Declarar na interface remota todos os métodos que são acessiveis remotamente /quepodem ser invocados sobre os objectos remotos. A declaração de cada método deve incluir as excepções (na cláusulathrows )

java.rmi.RemoteException.

public interface ContaBancoextends 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 ;}

Page 31: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 31/48

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

2 - Implementar os objectosremotos

Novamente num ficheiro à parte, agora com o nome do objectoremoto e extensão .java

Todo o objecto java RMI é uma instância de uma classe queextends java.rmi.server.UnicastRemoteObjectque implementa a

interface remota

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 declararjava.rmi.RemoteException,mesmo o constructor mesmo que vazio.

public class OperacoesMatImpl extends UnicastRemoteObject implements OperacoesMat{}

Page 32: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 32/48

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

Exemplo da implementação de uma Interface Remota

2 - Implementar os objectosremotos

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;

}}

Page 33: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 33/48

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

3 - Implementar o servidorremoto (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 classejava.rmi.Naming,método bind() ou o método rebind()

E é tudo!

Page 34: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 34/48

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

import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public classServidorContaBancoextendsUnicastRemoteObject implements ContaBanco

{public static voidmain(String [] args) {System.setSecurityManager(new RMISecurityManager()); // install RMI security managertry {

Stringname= args[0]; // name with which we can find it = user nameContaBancoImplserv= new ContaBancoImpl(250.0f); //cria uma nova instância,saldo inicial 250EurosNaming.rebind(name,serv); // registo com o servidor de nomesSystem.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);

}}}

3 - Implementar o servidor remoto (2)

Page 35: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 35/48

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 umcast da referência para a interface remota e invocar osmé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)

}}}

Page 36: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 36/48

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 eo servidor

Usar o comando javac Lê ficheiros .java Produz ficheiros .class

Gerar os stubs e skeletons com ormic (remote interface compiler) Usar o comando rmic Lê o ficheiro .class das implementações dos objectos Produz _Stub.class e _Skell.class

javacContaBanco.java javacContaBancoImpl.java

rmicContaBancoImpl javac ServidorContaBanco

Page 37: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 37/48

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

Compilando as classes remotas(Diagrama)

ContaBancoImpl_Stub.classContaBancoImpl_Skell.class

rmicContaBancoImpl.java ContaBancoImpl.class

javac

ContaBanco.java ContaBanco.class

javac

(Interface) (ficheiro class da Interface)

O

O compilador rmic toma com entrada aclasse que implementa as interface remotas

e gera as classes dos stubs e esqueletosEm versões maisrecentes do Java RMIÉ apenas gerada umaúnica classe

Page 38: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 38/48

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 WEBcp ContaCliente.class ContaBancoImpl_Stub.class Interface.class /

public_html

Page 39: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 39/48

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 javanuma determinada porta na máquina local; A porta por omissão dormiregistry é a 1099. Para um porto diferente indicar o respectivo númerocomo.

No MS Windows

Start rmiregistry ou start rmiregistry <novo porto> (e.g. startrmiregistry 6234) No Linux/Unix

rmiregistry & ou start rmiregistry <novo porto> (e.g. startrmiregistry 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>

Page 40: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 40/48

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ãoassumidos como parâmetros de entrada não é necessário especificar a direcção O resultado de um método é visto como umaparâmetro de saída

Regra geral, todo o objecto serializable – i.e., queimplementa a interface serializable pode ser passadocomo parâmetros ou retorno

Regra geral, todos os tipos primitivos e objectosremotos são serializable

As classes são carregadas automaticamente para odestinatário pelo sistema RMI sempre que necessário

Page 41: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 41/48

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 permiteguardar o estado (os dados) de instâncias de objectos

Os objectos serializable são convertidos numasequência de bytes (stream)

Os objectos serializados são re-criados na memória damáquina virtual remota e disponibilizados para oprograma Java remoto

Não é necessário escrever código particular!Basta osobjectos implementarem a interfacejava.io.Serializable

Page 42: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 42/48

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 queoriginou a chamada do método Os valores são passados entre JVMs de uma forma

normalizada, independente da plataforma, permitindo acomunicação entre plataformas diferentes com

fiabilidade

Page 43: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 43/48

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

Passagem de ObjectosNão Remotos

Regra geral, ao passar um objecto para um métodoremoto, o RMI envia o próprio objecto e não a suareferência (entre JVMs)

O objecto não remoto é passado por valor! Não areferência do objecto; O objecto não remoto é duplicado.

O retorno de um objecto por um método remoto implica acópia de todo o objecto para o programa que efectou achamada ao método remoto

O RMI utiliza a tecnologia da Serialização de Objectos Javapara transformar um objecto num formato linear para sertransmitido na rede

Page 44: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 44/48

Page 45: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 45/48

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 deseguranç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 numevil 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());}

Page 46: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 46/48

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 ligarnuma máquina particular)

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";};

Ficheiro security.policy

Page 47: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 47/48

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

Ficheiro security.policy

Consiste num número de entradas que começam pelainstrução grant Cada entrada descreve as permissões associadas a uma

dada operação

47

Page 48: Ad Cap6 Javarmi

8/8/2019 Ad Cap6 Javarmi

http://slidepdf.com/reader/full/ad-cap6-javarmi 48/48

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

Segurança do Carregamento de Código

O arranque dos programas cliente e servidor é tambémagora 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