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
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.
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
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
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)
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
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;}
8/8/2019 Ad Cap6 Javarmi
http://slidepdf.com/reader/full/ad-cap6-javarmi 8/48
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.
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)
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)
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
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.
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.
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
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
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 .
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
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)
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
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)
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
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 ;
}
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.
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
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)
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
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
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)
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 ;}
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{}
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;
}}
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!
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)
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)
}}}
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
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
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
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>
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
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
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
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
8/8/2019 Ad Cap6 Javarmi
http://slidepdf.com/reader/full/ad-cap6-javarmi 44/48
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());}
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
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
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