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

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

Remote Method Invocation

Apresentações semelhantes


Apresentação em tema: "Remote Method Invocation"— Transcrição da apresentação:

1 Remote Method Invocation
Descrição geral Criação de um servidor RMI Criação de um cliente RMI

2 Gab. F269 nribeiro@est.ips.pt
Introdução O sistema de Remote Method Invocation da linguagem JAVA, permite invocar métodos de objectos que estão a correr noutra máquina virtual. O RMI fornece mecanismos para comunicação remota, entre objectos criados na linguagem Java. Nuno Valero Ribeiro Gab. F269

3 Descrição geral de uma aplicação RMI
Aplicações RMI são normalmente constituídas por 2 programas: O servidor Cria objectos remotos (que serão evocados através do sistema RMI). Torna as referências para estes objectos acessíveis. Espera por chamadas dos clientes aos métodos dos objectos criados. O cliente Obtém referências para os objectos remotos a disponibilizados pelo servidor. Evoca os métodos dos objectos como se estes fossem locais. O sistema RMI fornece os mecanismos que permite a comunicação entre o cliente e o servidor. Este tipo de aplicações designam-se normalmente por “Aplicações de Objectos Distribuídos” ou “Aplicações distribuídas”. Nuno Valero Ribeiro Gab. F269

4 Aplicações de objectos distribuídos
Uma aplicação de objectos distribuídos suportada sobre RMI tem que: Localizar os objectos remotos (obter referências) Através do sistema de nomes do RMI (rmiregistry). Através da passagem de referências para objectos remotos no decorrer das operações da aplicação. Carregar os dados (serialização) e o código (bytecodes) dos objectos remotos (carregamento dinâmico de código). Nuno Valero Ribeiro Gab. F269

5 Interfaces, Objectos e métodos Remotos
À semelhança de uma aplicação Java tradicional, uma aplicação distribuída, que usa RMI, é constituída por interfaces e classes. Interfaces definem os métodos Classes implementam os métodos definidos nas interfaces e, possivelmente, métodos adicionais. Objectos que possuem métodos que podem ser evocados de outras máquinas virtuais são chamados Objectos Remotos . Os objectos de uma classe tornam-se remotos se esta implementar uma interface remota. Uma interface remota tem as seguintes características: Deriva (estende) da interface java.rmi.Remote. Cada método desta interface tem que declarar na cláusula de throws a excepção java.rmi.RemoteException, além das excepções específicas de cada método. Nuno Valero Ribeiro Gab. F269

6 Stub e Skeleton classes
O sistema RMI trata de forma diferente os objectos remotos dos restantes, quando estes são passados de uma máquina virtual (JVM) para outra. Objectos não remotos Enviada uma cópia para a JVM destino. Objectos remotos É enviado um objecto stub (proxy) para o objecto remoto. Stub É a referência local para o objecto remoto. Implementa o mesmo conjunto de interfaces remotas que o objecto remoto. Pode ser feito uma coerção (cast) do objecto stub para qualquer uma das interfaces remotas. Apenas os métodos definidos nestas interfaces podem ser evocados pelo cliente. O cliente evoca os métodos do stub. Enviam (serializam) os parâmetros de entrada de método para um agente existente no servidor (skeleton) , através de uma ligação TCPIP Recebem, através da ligação com skeleton, os parâmetros de retorno, após este ter evocado o método correspondente do objecto remoto. Retorna os parâmetros recebidos ao cliente. Skeleton Recebe do stub, os parâmetros de entrada do método. Evoca o método do objecto remoto com os parâmetros recebidos. Recebe os parâmetros de retorno do objecto remoto e retorna-os (serialização) ao stub. Nuno Valero Ribeiro Gab. F269

7 Fluxo de dados de uma evocação RMI
Nuno Valero Ribeiro Gab. F269

8 Geração de uma aplicação RMI
Para gerar uma aplicação distribuída com o RMI, devem ser seguidos os seguintes passos: Definir e implementar os componentes distribuídos (remotos) Definir as interfaces remotas. Implementar as classes dos objectos remotos Estas classes implementam uma ou mais interfaces remotas, e podem implementar outras interfaces (não remotas) que apenas terão visibilidade local. Implementar clientes. Os clientes podem ser implementados a partir do momento que as interfaces remotas estiverem definidas e compiladas. Compilar as sources e gerar os stubs (rmic) Compilar as sources com a implementação das interfaces remotas (javac). Criar os stubs (stub e skel) para os objectos remotos (rmic). Disponibilizar as classes necessárias ao cliente. Disponibilizar, através de um protocolo de URL, todas as classes necessárias ao cliente. Implementar cliente. Iniciar a aplicação Iniciar a aplicação de registo de objectos remotos (rmiregistry). Criar os objectos servidores, e regista-los no rmiregistry. Iniciar o cliente. Nuno Valero Ribeiro Gab. F269

9 1. Definir e implementar componentes distribuídos
Definição das interfaces Remotas package serverInterfaces.remote; import java.rmi.Remote; import java.rmi.RemoteException; import java.math.BigInteger; public interface Operator extends Remote { BigInteger add(BigInteger b1, BigInteger b2) throws RemoteException; BigInteger subtract(BigInteger b1, BigInteger b2) throws RemoteException; BigInteger divide(BigInteger b1, BigInteger b2) throws RemoteException; BigInteger multiply(BigInteger b1, BigInteger b2) throws RemoteException; } Nuno Valero Ribeiro Gab. F269

10 1. Definir e implementar componentes distribuídos
Implementação das classes Remotas public class OperatorServer extends UnicastRemoteObject implements Operator { public OperatorServer() throws RemoteException { } public BigInteger add(BigInteger b1, BigInteger b2) throws RemoteException { return b1.add(b2); } public BigInteger subtract(BigInteger b1, BigInteger b2) throws RemoteException { return b1.subtract(b2); public BigInteger divide(BigInteger b1, BigInteger b2) throws RemoteException { return b1.divide(b2); public BigInteger multiply(BigInteger b1, BigInteger b2) throws RemoteException { return b1.multiply(b2); public static void main(String []args) { System.setSecurityManager(new RMISecurityManager()); String name = "//localhost/OperatorServer"; try { OperatorServer os = new OperatorServer(); Naming.rebind(name,os); System.out.println(name + "bound"); } catch (Exception e) { System.err.println("OperatorServer exception: " + e.getMessage()); e.printStackTrace(); Nuno Valero Ribeiro Gab. F269

11 2. Compilar as sources e gerar os stubs
C:\OperatorServer> javac OperatorServer.java C:\OperatorServer> rmic OperatorServer C:\OperatorServer> dir <DIR> <DIR> OperatorServer.class OperatorServer.java OperatorServer_Skel.class OperatorServer_Stub.class java.policy <DIR> serverInterfaces Nuno Valero Ribeiro Gab. F269

12 3. Disponibilizar as classes necessárias ao cliente
As classes stub vão, numa primeira versão, ser disponibilizadas ao servidor através do protocolo file na directoria c:\ServerOperator Nuno Valero Ribeiro Gab. F269

13 4. Implementação do cliente
import java.rmi.*; import serverInterfaces.remote.*; import java.math.*; import java.lang.*; public class OperatorClient { public static void main(String args[]) { System.setSecurityManager(new RMISecurityManager()); String name = "//localhost/OperatorServer"; try { Operator o = (Operator)Naming.lookup (name); BigInteger b1 = new BigInteger(" "); BigInteger b2 = new BigInteger("1"); BigInteger b3 = o.add(b1, b2); System.out.println("b3: " + b3); } catch( Exception e) { System.out.println(e); e.printStackTrace(); } Nuno Valero Ribeiro Gab. F269

14 Gab. F269 nribeiro@est.ips.pt
5. Iniciar a aplicação rmiregistry Esta aplicação é o serviço onde os objectos remotos se vão registar, e onde os clientes vão pedir referências para os objectos remotos. Esta aplicação deve ser iniciada sem a variável de ambiente CLASSPATH definida. C:\> rmiregistry O código de registo do objecto servidor já está implementado no método main da classe dos objecto servidor. C:\> C:\OperatorServer> java –Djava.rmi.server.codebase=file:/c:\OperatorServer/ –Djava.security.policy=java.policy OperatorServer Iniciar o cliente C:\> C:\OperatorClient> java –Djava.security.policy=java.policy OperatorClient Nuno Valero Ribeiro Gab. F269

15 Gab. F269 nribeiro@est.ips.pt
Ficheiros java.policy Ficheiro java.policy do servidor grant { permission java.net.SocketPermission "*:1024-", "connect"; }; Ficheiro java.policy do cliente grant { permission java.net.SocketPermission "*:1024-", "connect"; permission java.io.FilePermission "D:\\OperatorServer\\-", "read"; } Nuno Valero Ribeiro Gab. F269


Carregar ppt "Remote Method Invocation"

Apresentações semelhantes


Anúncios Google