Download - 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
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