Vous êtes sur la page 1sur 50

Java RMI

Prof. Raul Ceretta Nunes UFSM

Contedo Programtico
Serializao de Objetos Objetos distribudos: Java RMI
Referncia:
captulo 12 do livro do Fernando Albuquerque, TCP/IP Internet programao de sistemas distribudos HTML, Javascript e Java, Axcel Books

Aplicaes
Desenvolvimento de um quadro de avisos

fevereiro de 07

Raul Ceretta Nunes

Serializao de Objetos
Stream java transmitem cadeias de bytes Java possibilita que objetos serializveis sejam transmitidos via streams Um objeto serializvel se implementa a interface Serializable Na serializao os atributos de um objeto so convertidos numa seqncia de bytes e na desserializao o objeto recuperado a partir da seqncia de bytes.
fevereiro de 07 Raul Ceretta Nunes 3

Ex: classe Mensagem


public class Mensagem implements java.io.Serializable { /** Tipos de mensagens POP, PUSH, RET_POP */ public String tipo; public short numero; public Mensagem(String tipo, short numero) { this.tipo = tipo; this.numero = numero; } public Mensagem() { this.tipo = ""; this.numero = (short)0; } public public public public }
fevereiro de 07 Raul Ceretta Nunes 4

void setTipo(String t) { tipo = t; } String getTipo() { return tipo; } void setNumero(short n) { numero = n; } short getNumero() { return numero; }

Ex: mtodo para serializao


private byte[] serialize (Object msg) { byte[] serializedMessage = null; try { ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bout); out.writeObject(msg); serializedMessage = bout.toByteArray(); } catch (java.io.IOException e2) { System.out.println("Erro ao tentar serializar mensagem."); System.exit(1); } return serializedMessage; }

fevereiro de 07

Raul Ceretta Nunes

Ex: mtodo para desserializao


private Object unserialize(byte[] msg) { Object unSerializedMessage = null; try { ByteArrayInputStream bin = new ByteArrayInputStream(msg); ObjectInputStream in = new ObjectInputStream(bin); unSerializedMessage = (Object)in.readObject(); } catch (java.io.IOException e1) { System.out.println("Erro na desserializao de uma mensagem."); System.exit(1); } catch (java.lang.ClassNotFoundException e2) { System.out.println("Erro na desserializao: classe inexiste."); System.exit(1); } return unSerializedMessage; }

fevereiro de 07

Raul Ceretta Nunes

RMI (Remote Method Invocation)


Tecnologia para possibilitar a invocao de mtodo remoto como se fosse mtodo local Possibilita a comunicao entre objetos em diferentes mquinas virtuais. Servios providos por objetos remotos so descritos por interfaces codificadas na prpria linguagem Java. Modelo de execuo: cliente-servidor Embora a invocao de mtodos remotos seja executada da mesma forma que para mtodos locais, a invocao de um mtodo remoto pode falhar. Invocaes de mtodos remotos obrigatoriamente devem ser tratadas atravs de excees.
fevereiro de 07 Raul Ceretta Nunes 7

Java RMI Funcionamento


Ao se trabalhar com RMI, alguns conceitos da programao convencional so modificados.
A criao de um objeto local feita utilizando-se o operador new, j no RMI, apenas o servidor pode crilo, o cliente no pode criar um objeto remoto. O acesso a objetos remotos feito via um objeto de referncia (stub). Uma referncia remota um ponteiro para um objeto proxy (stub). O proxy (stub) possui informaes que permitem a sua conexo ao objeto remoto de forma transparante, o qual contm a implementao dos mtodos.
fevereiro de 07 Raul Ceretta Nunes 8

Java RMI Mecanismos para a Comunicao Cliente/Servidor


Localizar objetos remotos - uma aplicao pode usar dois mecanismos para obter referncias de objetos remotos:
registrar o objeto remoto com a ferramenta de nomes do RMI, chamada rmiregistry; ou passar e retornar referncias aos objetos remotos como parte de sua operao normal.

Comunicao com objetos remotos - os detalhes de comunicao so abstrados pelo RMI.


O programador resolve uma chamada remota de forma idntica a uma chamada local.

Carregar bytecodes de objetos mveis - como o RMI permite que objetos remotos sejam passados como parmetros num mtodo, ele fornece os mecanismos necessrios para carregar o cdigo dos objetos remotos (serializao/desserializao implcitas).
fevereiro de 07 Raul Ceretta Nunes 9

Stubs
Quando um objeto local invoca um mtodo num objeto remoto, o stub fica responsvel por enviar a chamada ao mtodo para o objeto remoto. Passos do stub quando invocado:
1. iniciar conexo com a mquina virtual que contm o objeto remoto. 2. escrever e transmitir os parmetros para a mquina virtual remota. 3. esperar pelos resultados da invocao do mtodo. fevereiro de 4. ler os resultados retornados. 07 Raul Ceretta Nunes 10 5. retornar os valores ao objeto que executou a

O stub esconde a serializao dos parmetros e toda a comunicao a nvel de rede com o objetivo de simplificar o mecanismo de realizao da invocao do mtodo. Resultado: TRANSPARNCIA

fevereiro de 07

Raul Ceretta Nunes

11

Skeleton (stub do servidor)


Para o servidor receber a informao que est no stub do cliente, ele cria um objeto skeleton. O skeleton recebe invocaes diretamente do stub e as repassa para o objeto servidor. O skeleton executa as seguintes aes: Decodifica os parmetros; Chama localmente o mtodo remoto desejado; Captura o valor de retorno ou exceo e codifica-o; Retorna o valor codificado para o cliente. Em RMI, a comunicao de rede feita entre o stub de um objeto com o skeleton de outro objeto remoto.
fevereiro de 07 Raul Ceretta Nunes 12

Stub e Skeleton
Cliente Servidor

Stub

Skeleton

Camada de Ref. Remota Camada de Transporte

fevereiro de 07

Raul Ceretta Nunes

13

Java RMI - Mecanismo


cliente ... obj.m(msg); ... servidor ... public void m(Msg msg);{...} ...

stub

skeleton

Stub (lado cliente) Transforma parmetros (serializados) Envia requisio pela rede (sockets); Esqueleto (lado servidor) Recebe a requisio; desserializa os parmetros; e chama o mtodo no objeto remoto (local para ele).
fevereiro de 07 Raul Ceretta Nunes Compilador RMI (rmic) gera stub e skeleton 14

Caractersticas de Implementao
Para ser um objeto remoto, um objeto deve:
implementar uma interface que extende a interface java.rmi.Remote, que no possui definio de mtodos derivar da classe java.rmi.server.UnicastRemoteObject que gerencia as chamadas dos mtodos remotos e habilita a exportao do objeto. (UnicastRemoteObject utiliza TCP) Caso objeto no possa herdar, ele pode ser exportado invocando o mtodo exportObject().
fevereiro de 07 Raul Ceretta Nunes 15

Caractersticas de Implementao
Exemplo:
public interface IObjetoRemoto extends Remote public class ObjetoRemoto extends java.rmi.server.UnicastRemoteObject implements IObjetoRemoto ou public interface ObjetoRemoto extends Remote public class ObjetoRemotoImpl extends java.rmi.server.UnicastRemoteObject implements ObjetoRemoto
fevereiro de 07 Raul Ceretta Nunes 16

Caractersticas de Implementao
Passagem de parmetros
Um objeto, para ser passado por valor para um mtodo remoto, deve implementar java.io.Serializable.
public class MeuObjeto implements Serializable

Um objeto, para ser passado por referncia, deve extender a sua interface java.rmi.Remote.
interface IObjetoRemoto extends Remote
fevereiro de 07 Raul Ceretta Nunes 17

Caractersticas de Implementao
Invocao de mtodos
Os mtodos que podem ser invocados em um objeto remoto devem ser obrigatoriamente pblicos estar declarados na interface remota que esse objeto implementa obrigatoriamente tratar a exceo java.rmi.RemoteException.
public int inc() throws java.rmi.RemoteException
(esta exceo tambm deve ser colocado na interface e na aplicao que implementa o mtodo)
fevereiro de 07 Raul Ceretta Nunes 18

Caractersticas de Implementao
Localizao de objetos distribudos
Duas alternativas:
Receber referncia como um valor retornado por um mtodo Consultar um servio de registro chamado registry

O servio usado tanto por clientes como por servidores O servio mantm um banco de dados de todos os objetos remotos Quando o cliente deseja usar um objeto remoto, ele questiona o servio de registro rmi usando o nome do objeto
fevereiro de 07 Raul Ceretta Nunes 19

Caractersticas de Implementao
Localizao de objetos distribudos (cont.)
Servidor registra o objeto usando
Naming.rebind(rmi://localhost:2020/nomeServid or, servidor) Protocolo, host e porta so opcionais.
(Default = rmi://localhost:1099/)

Cliente recupera o objeto usando


java.rmi.Naming.lookup(nomeServidor) Servico s = (IServico)Naming.lookup(Server.HOST_URL); String HOST_URL = "rmi://10.16.165.46/Incrementa";

fevereiro de 07

Raul Ceretta Nunes

20

Caractersticas de Implementao
Localizao de objetos distribudos (cont.)
Antes de utilizar o servio necessrio ativ-lo: Executando o comando
c:\> rmiregistry

ou Criando servio de registro no cdigo do servidor


Registry registry = LocateRegistry.createRegistry(porta)

ou Recuperando referncia ao servio de registro no cdigo do servidor


Registry registry = LocateRegistry.getRegistry()

fevereiro de 07

Raul Ceretta Nunes

21

Caractersticas de Implementao
LocateRegistry.createRegistry(port)

Permite criar o rmiregistry na inicializao do programa, no sendo necessria sua execuo em separado.
LocateRegistry.getRegistry()

Recupera referncia a um servidor de registro


Naming.rebind(NomeDoObjeto,referenciaAoObjeto)

Permite registrar no rmiregistry um objeto remoto


Naming.unbind(HOST_URL,c)

Elimina registro do objeto remoto


fevereiro de 07 Raul Ceretta Nunes 22

Java RMI - Exemplo


Passos:
Definio da interface remota Implementao dos mtodos remotos Registro do objeto remoto Construo das aplicaes (cliente e servidor)

fevereiro de 07

Raul Ceretta Nunes

23

Java RMI Definio da Interface

fevereiro de 07

Raul Ceretta Nunes

24

Java RMI - Exemplo


Passos:
Definio da interface remota Implementao dos mtodos remotos Registro do objeto remoto Construo das aplicaes (cliente e servidor)

fevereiro de 07

Raul Ceretta Nunes

25

Java RMI Implementao dos Mtodos Remotos

fevereiro de 07

Raul Ceretta Nunes

26

Java RMI - Exemplo


Passos:
Definio da interface remota Implementao dos mtodos remotos Registro do objeto remoto Construo das aplicaes (cliente e servidor)

fevereiro de 07

Raul Ceretta Nunes

27

Java RMI Registro de Objetos Remotos

fevereiro de 07

Raul Ceretta Nunes

28

Java RMI - Exemplo


Passos:
Definio da interface remota Implementao dos mtodos remotos Registro do objeto remoto Construo das aplicaes (cliente e servidor)

fevereiro de 07

Raul Ceretta Nunes

29

Java RMI Const. do Servidor

fevereiro de 07

Raul Ceretta Nunes

30

Java RMI Construo do Cliente

fevereiro de 07

Raul Ceretta Nunes

31

RMI Outras Caractersticas


possvel o Cliente ser um objeto remoto tambm. Basta para isso ele implementar uma interface que extende java.rmi.Remote e extender java.rmi.server.UnicastRemoteObject. Dessa forma, o Cliente pode fazer chamadas ao servidor e o servidor pode fazer chamadas ao cliente. Esse mecanismo recebe o nome de callback. Nesse caso, o cliente tambm deve gerar sua stub com o rmic.
System.setSecurityManager(new RMISecurityManager())

deve ser utilizado para que o cliente possa fazer o download de classes serializveis que no estejam em seu CLASSPATH.
fevereiro de 07 Raul Ceretta Nunes 32

RMI Cliente-servidor de 3 camadas


Nas arquiteturas de objetos distribudos, nem sempre a comunicao entre as aplicaes no estilo cliente-servidor de duas camadas. Algumas vezes usual que o servidor RMI haja como cliente, para satisfazer os requisitos da aplicao, invertendo os papis com o cliente RMI original.

fevereiro de 07

Raul Ceretta Nunes

33

Comunicao Cliente/Servidor
(servidor atuando como cliente)

Interface com usurio Requisita operao Servidor de aplicao

Espera por uma resposta

Espera por um dado

Retorna resultado

Requisita dado Servidor de base de dados

Retorna dado

fevereiro de 07

Raul Ceretta Nunes

34

Arq. Cliente/Servidor (3 camadas)


Organizao geral de uma mquina de pesquisa
Interface do usurio Pgina HTML contendo lista Gerador de HTML Gerador de query Database queries componente elencador Lista de ttulos de pginas Nvel de processamento Nvel de interface do usurio

Expresso de busca

Banco de dados com pginas web


fevereiro de 07

Ttulos de pginas web com meta-informao


Raul Ceretta Nunes

Nvel de dados
35

RMI Callback
Outra ocasio que faz servidor parecer cliente. Callback uma chamada assncrona normalmente utilizada para informar sobre a ocorrncia de um evento de interesse. Por exemplo: um cliente deseja saber se outro cliente realizou alguma atualizao no valor do contador mantido pelo objeto remoto.
Incrementa x

servidor
Servidor avisa alterao em x
fevereiro de 07 Raul Ceretta Nunes

Cliente 1 Cliente 2
36

RMI Callback
Callback uma tcnica tipicamente utilizada quando a aplicao cliente requer um retorno do servidor mas no quer permanecer bloqueado aguardando a resposta. Atravs dessa tcnica, o servidor obtm uma referncia para o cliente de forma que pode invocar remotamente um mtodo do objeto cliente. Assim, quando a execuo do servio solicitado concluda, o servidor pode notificar o cliente atravs da invocao do mtodo disponibilizado pelo cliente para uso remoto.
fevereiro de 07 Raul Ceretta Nunes 37

RMI Polticas de Segurana


O carregamento do cdigo de uma classe para a JVM realizado pelo class loader da mquina virtual. O class loader, deve obedecer a uma poltica de segurana estabelecida para aquela mquina virtual. Com a incluso do conceito de poltica de segurana, possvel estabelecer permisses diferenciadas para as aplicaes, visando evitar que algum objeto realize operaes no-autorizadas na mquina.

fevereiro de 07

Raul Ceretta Nunes

38

RMI Polticas de Segurana


Para criar um SecurityManager padro para aplicaes usando RMI, a seguinte linha de cdigo deve ser includa antes de executar qualquer operao envolvendo classes remotas:
System.setSecurityManager(new RMISecurityManager());

Problema de permisso para conexes foi resolvido adicionando -Djava.security.policy=rmi.policy aos parmetros de execuo, onde rmi.policy pode ser:
grant{ permission java.security.AllPermission; };

Ex: java -Djava.security.policy=rmi.policy


fevereiro de 07 Raul Ceretta Nunes

<NomeDaClasse>
39

Exemplo-CallBack

fevereiro de 07

Raul Ceretta Nunes

40

Criar a Interface do Servidor


O que precisamos? No podemos esquecer de herdar a classe: java.rmi.Remote Todos os mtodos da interface devem ser pblicos e lanar excees com a classe: java.rmi.RemoteException

fevereiro de 07

Raul Ceretta Nunes

41

Criar a Interface do Cliente


Para implementar CallBack, ou seja, para que o servidor acesse o cliente, o mesmo deve criar uma interface com os mesmos procedimentos da interface do servidor, disponibilizando os mtodos que sero utilizados pelo servidor.

fevereiro de 07

Raul Ceretta Nunes

42

O Prximo Passo Implementar os Mtodos das Interfaces. No exemplo, os mtodos sero implementados dentro da classe cliente e servidor

fevereiro de 07

Raul Ceretta Nunes

43

Criando o Servidor
1- No devemos esquecer que onde os mtodos da interface so implementados, a classe deve herdar a classe: java.rmi.UnicastRemoteObject 2- A classe tambm deve implementar a interface com o comando implements. 3- Instalao de um gerenciador de segurana. RMISecurityManager() 4- Criar o objeto remoto [classe que implementa o mtodo] Tserver server = new Tserver() 5- Registrar o objeto.
//evita a utilizao do rmiregistry LocateRegistry.createRegistry(Registry.REGISTRY_PORT); Naming.rebind("rmi://"+args[0]+"/TServer",server);
fevereiro de 07 Raul Ceretta Nunes 44

fevereiro de 07

Raul Ceretta Nunes

45

Criando o Cliente
Os passos 1, 2 e 3 so executados no cliente tambm. 4- Criar o objeto remoto [da interface do servidor]
IServer server = (IServer) Naming.lookup("URL");

5- Recuperar o objeto
Naming.lookup("URL")

fevereiro de 07

Raul Ceretta Nunes

46

fevereiro de 07

Raul Ceretta Nunes

47

Criar a Classe Tarefa


Essa classe acessada pelo servidor, atravs do mtodo executeTask, por isto o objeto precisa ser serializvel (formato apropriado para transmisso de uma mquina virtual para outra).

fevereiro de 07

Raul Ceretta Nunes

48

Criar Poltica de Segurana

fevereiro de 07

Raul Ceretta Nunes

49

Consideraes Finais
Positivo
Facilidade de implementao e manuteno por ser orientado objetos. Outro aspecto positivo a portabilidade, pois se tratando de cdigo totalmente escrito em Java, qualquer computador que possua uma JVM pode rodar estes programas.

Negativo
Ineficincia da serializao, pois atributos private e static no so serializados. A necessidade de extender java.rmi.Remote para um objeto ser passado como referncia uma limitao de Java em no permitir a herana mltipla. Assim, um objeto remoto no pode herdar de outro objeto.
fevereiro de 07 Raul Ceretta Nunes 50

Vous aimerez peut-être aussi