A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Invocação de Métodos Remotos RMI

Apresentações semelhantes


Apresentação em tema: "Invocação de Métodos Remotos RMI"— Transcrição da apresentação:

1 Invocação de Métodos Remotos RMI
(Remote Method Invocation) Ronaldo Celso Messias Correia

2 Programação com Objetos Distribuídos
Um sistema de objetos distribuídos permite a operação com objetos remotos A partir de uma aplicação cliente orientada a objetos, obter uma referência para um objeto que oferece o serviço desejado e, através dessa referência, invocar métodos desse objeto Dois mecanismos são oferecidos em Java Java RMI Java IDL

3 Java RMI (Remote Method Invocation)
É uma abstração utilizada para comunicação em rede Possibilita que um objeto ativo em uma máquina virtual Java possa interagir com objetos de outras máquinas virtuais Java, independente da localização A operação de RMI está baseada num ambiente de comunicação específico formado por três elementos: O servidor Cria objetos remotos (que serão invocados através do sistema RMI) Deve especificar uma interface contendo os métodos a serem disponibilizados para acesso remoto e ainda estabelece uma “associação” entre o objeto da classe que implementa esses métodos e um endereço IP e porta TCP locais Espera por chamadas dos clientes aos métodos dos objetos criados O cliente Obtém referências para os objetos remotos disponibilizados pelo servidor Invoca os métodos dos objetos como se estes fossem locais O Servidor de registro Funciona de forma parecida com um servidor DNS Armazena as informações de localização dos servidores RMI que estejam registrados Os servidores RMI precisam se associar ao servidor de registro Os clientes RMI precisam consultar esses servidores Ambos devem saber o endereço do servidor de registros

4 Arquitetura RMI Oferece a transparência de localização através da organização de três camadas entre os objetos cliente e servidor: A camada de stub/skeleton oferece as interfaces que os objetos da aplicação usam para interagir entre si A camada de referência remota é o middleware entre a camada de stub/skeleton e o protocolo de transporte. É nesta camada que são criadas e gerenciadas as referências remotas aos objetos A camada do protocolo de transporte oferece o protocolo de dados binários que envia as solicitações aos objetos remotos pela rede.

5 Interface para um serviço RMI
A especificação de uma interface remota é equivalente à definição de qualquer interface em Java, a não ser pelos seguintes detalhes: A interface deverá, direta ou indiretamente, estender a interface Remote (do pacote java.rmi) Todo método da interface deverá declarar que a exceção RemoteException (ou uma de suas superclasses) pode ser gerada na execução do método Exemplo: // Count Interface import java.rmi.*; public interface Count extends Remote { void set(int val) throws RemoteException; void reset() throws RemoteException; int get() throws RemoteException; int increment() throws RemoteException; } }

6 Serviço remoto em RMI Definido por meio de uma classe que implementa a interface especificada Incluir as funcionalidades para que um objeto dessa classe possa ser acessado remotamente como um servidor. Classe abstrata RemoteServer, do pacote java.rmi.server Uma subclasse concreta de RemoteServer oferecida no mesmo pacote é UnicastRemoteObject, que mantém uma conexão ponto-a-ponto com cada cliente que o referencia import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class CountImpl extends UnicastRemoteObject implements Count { private int sum; public CountImpl() throws RemoteException { } public void set(int val) throws RemoteException { sum = val; } public void reset() throws RemoteException { sum = 0; } public int get() throws RemoteException { return sum; } public int increment() throws RemoteException { return sum++; } }

7 O Servidor RMI Um objeto servidor RMI simples deve realizar as seguintes tarefas: Criar uma instância do objeto que implementa o serviço Disponibilizar o serviço através do mecanismo de registro // CountServer.java import java.rmi.registry.*; import java.rmi.*; public class CountServer { public static void main(String[] args) { try {// Localizador do servidor de registro e nome pelo qual o serviço será posteriormente localizado String serviceName = “// /Count001"; // Cria objeto servidor CountImpl myCount = new CountImpl(); // Registra o objeto servidor Naming.rebind(serviceName, myCount); // Servidor está preparado para solicitações de clientes System.out.println("Count Server ready."); } catch (Exception e) { System.out.println("Exception: " + e.getMessage()); e.printStackTrace(); } } }

8 Registro de RMI O programa servidor registra os objetos com o serviço de registro de partida e o cliente recupera stubs para esses objetos O aplicativo rmiregistry é uma implementação de um serviço de nomes para RMI O serviço de nomes é uma espécie de diretório, onde cada serviço disponibilizado na plataforma é registrado através de um nome do serviço, uma string única para cada objeto que implementa serviços em RMI Para iniciar o registro no Windows: > start rmiregistry

9 Criando stubs e skeletons
Uma classe stub oferece implementações dos métodos do serviço remoto que são invocadas no lado do cliente. Internamente, esses métodos empacotam (marshall) os argumentos para o método e os envia ao servidor A implementação correspondente no lado servidor, no skeleton, desempacota (unmarshall) os dados e invoca o método do serviço Obtido o valor de retorno do serviço, o servidor empacota e envia esse valor para o método no stub, que ainda estava aguardando esse retorno. Obtido o valor de retorno no stub, esse é desempacotado e retornado à aplicação cliente como resultado da invocação remota O processo de marshalling utiliza o mecanismo de serialização de Java Argumentos e valores de retorno de métodos remotos invocados através de RMI estão restritos a tipos primitivos de Java e a objetos de classes que implementam Serializable > javac Count.java > javac CountImpl.java Com a classe CountImpl.class disponível, a execução do comando > rmic CountImpl Gera as classes CountImpl_Stub.class e CountImpl_Skel.class, correspondendo respectivamente ao stub e ao skeleton para o serviço

10 Clientes RMI A principal etapa no desenvolvimento de uma aplicação cliente RMI é a obtenção da referência remota para o objeto (remoto) que implementa o serviço desejado O cliente RMI usa o serviço padrão oferecido pelo mecanismo de registro de nomes de serviços Uma vez que a referência remota seja obtida, ela pode ser convertida (downcast) para uma referência para a interface que especifica o serviço Os métodos oferecidos pelo serviço remoto são invocados da mesma forma que ocorre para objetos locais import java.rmi.registry.*; public class CountReset { public static void main(String args[]) { try { // Localiza o serviço pelo nome através do rmiregistry Count myCount = (Count) Naming.lookup(“Count001”); // Realiza operações com objeto remoto myCount.reset(); } catch(Exception e) { e.printStackTrace(); } System.exit(0); } }

11 Politica de Segurança RMI
Para permitir que o cliente se conecte com o registro do RMI e com o objeto do servidor, deve ser criado um arquivo de política Arquivo cliente.policy Para executar o programa cliente, especificar o arquivo de política: grant { permission java.net.SocketPermission “*: ”, “connect”; }; > java –Djava.security.policy=client.policy CountReset

12 Observações Importantes
Os métodos remotos podem receber e retornar objetos Estes objetos devem implementar a interface Serializable Tipos primitivos são passados por valor e objetos por referência nas chamadas dos métodos O cliente chama o método remoto usando um Stub O Stub então envia uma mensagem para o Skeleton na máquina remota, contento os argumentos da chamada ao método remoto O Skeleton empacota a resposta e envia ela de volta para o stub na máquina do cliente

13 Descrição do Fluxo RMI

14 Comparações Socket RMI Transporte UDP / TCP JRMP Descrição do Serviço
Não existe Java Interface Localização Conhece endereço RMI Naming Service Look Up matching Exact String Match Remote reference Proxy object Synchronicity Synchronous Garbage Collection Language paradigm Streams Method call Transporte – como os pacotes se movimentão JRMP - java remote method protocol

15 Processo de Criação da Aplicação
Compilar os arquivos das classes interface, implementação, cliente e servidor Javac *.java Gerar o stub/skeleton Rmic Ativação do serviço de nomes Start rmiregistry Inicie o servidor Start java server Excutar o cliente Java –Djava.security.policy=client.policy Cliente

16 Envio de Mensagens para um servidor
Interface: ServidorInt.java Servidor: Servidor.java Cliente: Cliente.java

17 ServidorInt.java import java.rmi.*;
public interface ServidorInt extends Remote{ void imprimeMensagem(String mensagem) throws RemoteException; }

18 Servidor.java import java.rmi.*; import java.rmi.server.*; import sun.rmi.registry.RegistryImpl; public class Servidor extends UnicastRemoteObject implements ServidorInt { public Servidor() throws RemoteException { super(); RegistryImpl impl = new RegistryImpl(1099); } public void imprimeMensagem(String mensagem) { System.out.println("A mensagem enviada foi : " + mensagem); public static void main(String args[]) { try { Servidor s = new Servidor(); Naming.rebind("servidor", s); System.out.println("Servidor Registrado"); catch (Exception e) { System.out.println("Erro : Mensagem : " + e.getMessage()); e.printStackTrace();

19 Cliente.java import java.rmi.*; import java.io.*; public class Cliente
implements Serializable { public static void main(String args[]) { try { ServidorInt s = (ServidorInt) Naming.lookup("servidor"); s.imprimeMensagem(“Hello CIn!"); } catch (Exception e) { System.out.println("Erro: Mensagem: " + e.getMessage()); e.printStackTrace();


Carregar ppt "Invocação de Métodos Remotos RMI"

Apresentações semelhantes


Anúncios Google