RMI -Hello

22
Hello Distribuited Word Versão distribuída do Olá Mundo usando Java RMI. No exemplo Olá Mundo distribuído, um cliente faz uma chamada de método remoto ao servidor, para obter a mensagem "Olá, mundo!". Quando o cliente é executado, "Olá, mundo!" é saída para o cliente System.out.println. Para conseguir isso, é preciso: Fazer as fontes de Java Compilar e implantar arquivos de classe Iniciar o registro RMI, servidor e cliente

description

Apresentação para criar um HelloWorld distribuído usando RMI

Transcript of RMI -Hello

Page 1: RMI -Hello

Hello Distribuited Word

Versão distribuída do Olá Mundo usando Java RMI. No exemplo Olá Mundo distribuído, um cliente faz uma

chamada de método remoto ao servidor, para obter a mensagem "Olá, mundo!". Quando o cliente é executado, "Olá, mundo!" é saída para o cliente System.out.println. Para conseguir isso, é preciso:

Fazer as fontes de Java

Compilar e implantar arquivos de classe

Iniciar o registro RMI, servidor e cliente

Page 2: RMI -Hello

Interface Remota

Se você deseja chamar remotamente. Interfaces remotas têm as seguintes

características: Ele estende a interface java.rmi.Remote. Cada método deve declarar

java.rmi.RemoteException (ou uma superclasse de RemoteException) em sua cláusula throws.

importar java.rmi. *;

interface pública Olá estende java.rmi.Remote{

Corda sayHello () lança RemoteException;}

Page 3: RMI -Hello

Implementação da classe de servidor remoto

No mínimo, uma classe de objeto remoto deve:

Implementar pelo menos uma interface remota. Definir um construtor para o objeto remoto.

A classe "server", neste contexto, é a classe que tem um principal método que: cria uma instância da implementação do objeto remoto, e liga essa instância para um nome no rmiregistry.

A classe que contém esse principal método poderia ser a própria classe de implementação, ou outra classe.

Neste exemplo, o principal método é parte de examples.hello.HelloImpl. O programa servidor precisa:

Instanciar o objeto remoto. Registre o objeto remoto com o rmiregistry.

Page 4: RMI -Hello

Implementação da classe de servidor remoto

import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject;public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl() throws RemoteException {}

public String sayHello() { return "Hello world!"; }

public static void main(String args[]) { try { HelloImpl obj = new HelloImpl(); // Bind this object instance to the name "HelloServer" Naming.rebind("HelloServer", obj); } catch (Exception e) { System.out.println("HelloImpl err: " + e.getMessage()); e.printStackTrace(); } } }

Page 5: RMI -Hello

Definir o construtor para o objeto remoto

Sua instância objeto remoto é exportado: torná-lo disponível para aceitar entrada de método remoto invocações ouvindo para as chamadas recebidas para o objeto remoto em uma porta anônima.

Quando você estende classe java.rmi.server.UnicastRemoteObject, sua classe é exportado automaticamente após a criação.

Porque a exportação objeto poderia jogar um java.rmi.RemoteException, você deve definir um construtor que joga um RemoteException, mesmo se o construtor não faz nada mais. O construtor sem argumento para a superclasse, UnicastRemoteObject, diz o RemoteException exceção em sua cláusula throws, para que o seu construtor também deve declarar que pode jogar RemoteException. A RemoteException pode ocorrer durante a construção, se a tentativa de exportar o objeto falha - devido, por exemplo, recursos de comunicação que está sendo indisponíveis ou a classe stub adequado não foi encontrado.

Page 6: RMI -Hello

Instanciar um objeto remoto

O principal método de o servidor cria uma instância da implementação do objeto remoto:

HelloImpl obj = new HelloImpl ();

O construtor exporta o objeto remoto: Uma vez criado, o objeto remoto está pronto para aceitar as chamadas recebidas.

Page 7: RMI -Hello

Registre o objeto remoto

Para um cliente para chamar um método em um objeto remoto, ele deve obter uma referência para o objeto remoto.

O sistema RMI oferece um registro de objeto remoto que lhe permite ligar um nome formatado-URL da forma "// host / objectname" para o objeto remoto, onde objectname é um nome de cadeia simples.

O registro RMI é um servidor de nome do lado do servidor simples que permite que clientes remotos para obter uma referência a um objeto remoto.

Ele normalmente é usado para localizar apenas o primeiro objeto remoto um cliente RMI precisa conversar. Então, esse primeiro objeto, por sua vez, fornece específicos do aplicativo de suporte obter referências para outros objetos.

Por exemplo, a referência pode ser obtido como um parâmetro para, ou a partir de um valor de retorno, uma outra chamada de método remoto.

Uma vez que um objeto remoto está registrado no rmiregistry, os clientes podem:

obter uma referência objeto remoto (por exemplo, vendo-o no rmiregistry)

invocar remotamente métodos no objeto.

Por exemplo, o seguinte código liga o nome "HelloServer" para uma referência para o objecto remoto:

Naming.rebind ("HelloServer", obj);

Page 8: RMI -Hello

Escreva um programa cliente que usa o serviço remoto

Defina o gestor de segurança, de modo que o cliente pode fazer o download do código de stub.

Obtenha uma referência para a execução do objeto remoto (anunciado como "HelloServer") a partir do host do servidor rmiregistry.

Invocar o remoto sayHello método no objeto remoto do servidor

Page 9: RMI -Hello

Escreva um programa cliente que usa o serviço remoto

import java.rmi.RMISecurityManager; import java.rmi.Naming; import java.rmi.RemoteException;public class HelloClient { public static void main(String arg[]) { String message = "blank";

// I download server's stubs ==> must set a SecurityManager System.setSecurityManager(new RMISecurityManager());

try { Hello obj = (Hello) Naming.lookup( "//" + "lysander.cs.ucsb.edu" + "/HelloServer"); //objectname in registry System.out.println(obj.sayHello()); } catch (Exception e) { System.out.println("HelloClient exception: " + e.getMessage()); e.printStackTrace(); } } }

Page 10: RMI -Hello

Compilar e Implantar arquivos de Classe

O código fonte para o exemplo Olá mundo agora está completa:

Hello.java, que contém o código fonte para o Olá interface remota.

HelloImpl.java, que é o código fonte para o HelloImpl implementação de objeto remoto, o servidor para o cliente Olá Mundo.

HelloClient.java, que é o código fonte para o cliente.

Page 11: RMI -Hello

Compilar os arquivos de origem Java

Use rmic to generate skeletons and/or stubs

O rmic comando pega um ou mais nomes de classe como um argumento e produz arquivos de classe do formulário MyImpl_Skel.class e MyImpl_Stub.class.

Por exemplo, para criar o stub e esqueleto para o HelloImpl implementação de objeto remoto, execute rmic como este:

rmic HelloImpl

HelloImpl_Stub.class

HelloImpl_Skel.class

Page 12: RMI -Hello

Comece o registro RMI, servidor e cliente

Nota: Antes de iniciar o rmiregistry, você deve se certificar de que o shell ou janela na qual você irá executar o registro, ou não tem CLASSPATH definida ou tem um CLASSPATH que não inclua o caminho para todas as classes que você quer transferidas para o seu cliente , incluindo os tocos para suas classes de implementação objeto remoto.

Se você iniciar o rmiregistry, e ele pode encontrar suas classes stub em seu CLASSPATH, ele irá ignorar o servidor java.rmi.server.codebase propriedade, e, como resultado, seu cliente (s) não será capaz de fazer o download do código de stub para o objeto remoto.

Para iniciar o registo no servidor, execute o rmiregistry comando.

Este comando não produz nenhuma saída e geralmente é executado em segundo plano.

.

Page 13: RMI -Hello

Execute o cliente

Page 14: RMI -Hello

Calculadora RMI

Page 15: RMI -Hello

A aplicação RMI é realmente muito simples. Trata-se de uma calculadora (Calculator) que recebe

dois inteiros e devolve os resultados das quatro operações: soma, subtração, multiplicação e divisão.

A aplicação-cliente (CalculatorClient) se conectará à aplicação- servidor (CalculatorServer).

CalculatorClient enviará dois valores inteiros e o servidor devolverá a o resultado das operações soma, subtração, multiplicação e divisão, dos valores fornecidos.

Page 16: RMI -Hello

Escrevendo a aplicação Calculadora em Java RMI

Abrir o NetBeans e criar um novo projeto. Vá até a opção Arquivo -> Novo Projeto.

Na janela de novo projeto escolha Java de um lado e Aplicativo Java do outro.

Clique o botão Próximo.

Dê o nome Calculadora ao projeto e salve-o no diretório

"C:\...\NetbeansProjects\RMI\" de forma que a pasta do projeto seja

"C:\...\NetbeansProjects\RMI\Calculadora".

Clique o botão Finalizar.

Page 17: RMI -Hello

Criando a interface remota

A interface remota será compartilhada tanto pela aplicação-servidor quanto pela aplicação-cliente.

A exceção java.rmi.RemoteException indica erros na chamada remota, e deve ser prevista pelos métodos de interfaces RMI.

public interface Calculator extends java.rmi.Remote { public long add(long a, long b) throws java.rmi.RemoteException; public long sub(long a, long b) throws java.rmi.RemoteException; public long mul(long a, long b) throws java.rmi.RemoteException; public long div(long a, long b) throws java.rmi.RemoteException; }

Page 18: RMI -Hello

Criando a implementação da interface Calculator

Classe que implementa esta interface Calculatorpublic class CalculatorImpl

extends java.rmi.server.UnicastRemoteObject implements Calculator {

public CalculatorImpl() throws java.rmi.RemoteException { super(); } public long add(long a, long b) throws java.rmi.RemoteException { return a + b; } public long sub(long a, long b) throws java.rmi.RemoteException { return a - b; } public long mul(long a, long b) throws java.rmi.RemoteException { return a * b; } public long div(long a, long b) throws java.rmi.RemoteException { return a / b; } }

Page 19: RMI -Hello

Criando o servidor CalculatorServer Implementar o servidor CalculatorServer e registrá-lo com

o RMI server.

Na main() vamos criar um objeto que implementa a interface Calculator e registrá-lo como um servidor no registro do RMI, com o nome "CalculatorService", para que ele possa ser localizado pelo cliente CalculatorClient.import java.rmi.Naming;

public class CalculatorServer { public CalculatorServer() { try { Calculator c = new CalculatorImpl(); Naming.rebind("//localhost/CalculatorService", c);

System.out.println(“Servidor Bacalá operacional”); } catch (Exception e) { System.out.println("Trouble: " + e); } } public static void main(String args[]) { new CalculatorServer(); }}

Page 20: RMI -Hello

Executando... Se executá-la, ocorre o erro:

Trouble: java.rmi.ConnectException: Connection refused to host:

localhost; nested exception is: java.net.ConnectException: Connection refused: connect

Abra uma janela de comando e inicie o RMI Registry.

Execute o servidor a partir de uma janela

> cd C:\Users\bosco\Documents\NetbeansProjects\RMI\Calculadora\src\calculadora\start rmiregistry

Isso fará com que uma nova janela de comando seja aberta. Não a feche. O RMI Registry está sendo executado nela. 

>C:\Users\bacala\Documents\NetbeansProjects\RMI\Calculadora\dist>Calculadora.jar

Page 21: RMI -Hello

Criando a aplicação-cliente CalculatorClient

import java.rmi.Naming;

public class CalculatorClient { public static void main(String[] args) { try { Calculator c = (Calculator)

Naming.lookup( "rmi://10.221.225.49:1099/CalculatorService"); System.out.println( c.sub(4, 3) ); System.out.println( c.add(4, 5) ); System.out.println( c.mul(3, 6) ); System.out.println( c.div(9, 3) ); } catch (Exception e) { System.out.println(e); } }}

Execute e veja os resultados...

Substitua o IP de sua máquina pelo IP do colega e execute.

Page 22: RMI -Hello

Compilando pelo prompt da linha de comando e estabelecendo variáveis

de ambiente no Windows:

Estabelecer as variáveis de ambiente:    JAVA_HOME  =  C:\Arquivos de

programas\Java\jdk1.6.0_xx

CLASSPATH  =  .;C:\Arquivos de programas\Java\jdk1.6.0_xx\lib

(lembre do ponto,  seguido de ponto e vírgula, no antes de C:\, no estabelecimento da variável de ambiente CLASSPATH.     

PATH = C:\Arquivos de programas\Java\jdk1.6.0_xx\bin Inicializar o computador