rmi -hello

Post on 11-Jan-2016

272 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

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;}

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.

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(); } } }

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.

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.

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);

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

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(); } } }

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.

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

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.

.

Execute o cliente

Calculadora RMI

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.

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.

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; }

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; } }

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(); }}

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

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.

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

top related