Pular para o conteúdo principal

Sistemas distribuídos: Introdução ao JAVA RMI

Objetos remotos são objetos cujos métodos podem ser chamados remotamente, como se fossem locais.
O Cliente precisa, de alguma forma, localizar e obter uma instância do objeto remoto . Depois que o cliente tem a referência, faz chamadas nos métodos do objeto remoto usando a mesma sintaxe que usaria se o objeto fosse local. Objetos remotos abstraem toda a complexidade da comunicação em rede.

Java RMI (Remote Method Invocation) pode ser implementado usando protocolos e infraestrutura próprios do Java (JRMP e RMI Registry) ou usando IIOP e ORBs, próprios do CORBA. JRMP - Java Remote Method Protocol : Pacotejava.rmi-RMI básico Ideal para aplicações 100% Java.

Um objeto remoto previamente registrado é obtido, através de servidor de nomes especial: RMI Registry. O RMI Registry permite que os objetos publicamente acessíveis através da rede sejam referenciados através de um nome.

Uma aplicação distribuída com RMI tem acesso transparente ao objeto remoto através de sua Interface Remota. A "Interface Remota" é uma interface que estende java.rmi.Remote , A partir da Interface Remota e implementação do objeto remoto o sistema gera objetos (proxies) que realizam todas as tarefas necessárias para viabilizar a comunicação em rede.




A "Interface Remota" é uma interface que estende java.rmi.Remote . A partir da Interface Remota e implementação do objeto remoto o sistema gera objetos (stubs) que realizam todas as tarefas necessárias para viabilizar a comunicação em rede.

Veja os 10 passos para a construção de um exemplo mínimo do uso de Java RMI .
1. Definir a interface
2. Implementar os objetos remotos
3. Implementar um servidor para os objetos
4. Compilar os objetos remotos
5. Gerar stubs e skeletons com rmic
6. Escrever, compilar e instalar o(s) cliente(s)
7. Instalar o stub no(s) cliente(s)
8. Iniciar o RMI Registry no servidor
9. Iniciar o servidor de objetos
10. Iniciar o cliente


Organização dos arquivos:
Antes de começarmos sugiro que você crie uma pasta para o projeto e dentro desta pasta crie duas subpastas como nome cliente e servidor. Precisamos separar os códigos do cliente do código do servidor. Estou contando nesse exemplo que primeiramente você vai criar o cliente e servidor rodando na mesma maquina por isso vou utilizar o endereço de loopback da interface de rede , depois explico como levar os arquivos para outra maquina para testa-los na rede .


1. Definir a interface Remota
Declare todos os métodos que serão acessíveis remotamente em uma interface Java que estenda java.rmi.Remote.  Todos os métodos devem declarar throws java.rmi.RemoteException. Isto deve ser feito para cada objeto que será acessível através da rede.

import java.rmi.*; 

public interface Mensagem extends Remote {
public String getMensagem() throws RemoteException;
public void setMensagem(String msg) throws RemoteException;
}

2. Implementar os objetos remotos
Cada objeto remoto é uma classe que estende a classe java.rmi.server.UnicastRemoteObject e que implementa a interface remota criada no passo 1.  Todos os métodos declaram causar java.rmi.RemoteException inclusive o construtor, mesmo que seja vazio.

import java.rmi.server.*; 
import java.rmi.*;


public class MensagemImpl extends UnicastRemoteObject implements Mensagem {

private String mensagem = "Inicial"; 

public MensagemImpl() throws RemoteException {} 

 public String getMensagem() throws RemoteException {
 return mensagem;
 } 
 public void setMensagem(String msg) throws RemoteException {
 mensagem = msg;
 }
}

3. Implementar um servidor para os objetos
Crie uma classe que crie uma instância do objeto a ser servido e  Registre-a (bind ou rebind) no serviço de nomes.

import java.rmi.*;

public class MensagemServer {

public static void main(String [ ] args) throws RemoteException{

Mensagem mens = new MensagemImpl( );
try{
 Naming.rebind("mensagem", mens) ;
 System.out.println("Servidor no ar : Nome do objeto servido: mensagem");
 } catch( Exception ex){
  
 }

}

}
O try catch no comando rebind é necessário porque um erro nessa operação dispara uma exceção MalformedURLException.

4. Compilar os objetos remotos
Para esse passo abra um terminal de comando entre na pasta onde seus arquivos .java estão armazenados e compile os arquivos.

5. Gerar stubs e skeletons com rmic
Ainda na pasta do servidor use o rmic( RMI Compiler ) para gerar os stubs , nas ultimas versões do RMI os arquivos skeletons não são mais gerados .Execute o rmic sobre as implementações do objeto remoto
já compiladas: no nosso caso rmic MensagemImpl. O rmic vai gerar um arquivo stub no nosso exemplo o MensagemImpl_Stub.class .


6. Escrever, compilar e instalar o(s) cliente(s)Escreva uma classe cliente que localize o(s) objeto(s) no serviço de nomes (java.rmi.Naming) . Após obter uma instância remota de cada objeto ,podemos usar o objeto, chamando seus métodos.
import java.rmi.*; 
public class MensagemCliente {
public static void main(String[] args) throws Exception {

Object obj = Naming.lookup("rmi://127.0.0.1/mensagem");

Mensagem mens = (Mensagem) obj; 
System.out.println("Mensagem recebida: "+ mens.getMensagem()); 
mens.setMensagem("Fulano esteve aqui!");

}
}
Depois de salvar o arquivo na pasta cliente copie o arquivo da interface remota( Mensagem.java) que está na pasta servidor( é isso mesmo usamos a mesma definição de interface remota para os dois lados , aplicação cliente e servidor ) para a mesma pasta e compile os dois arquivos.

7. Instalar o stub no(s) cliente(s)
Copie o arquivo Stub gerado pelo rmic que estão na pasta servidor , o java tem um mecanismo de download de classes stubs mas a configuração desse mecanismo foge ao escopo desse post.

8. Iniciar o RMI Registry no servidor
O RMIRegistry é um serviço de nomes de objetos remotos é ele que vai atender ao lookup da aplicação cliente . Você deve rodar o comando dentro da pasta onde se encontra os arquivos .class.
Neste exemplo será preciso iniciar o RMIRegistry no diretório onde estão os stubs e interface Remote . Isto é para que o RMIRegistry veja o mesmo CLASSPATH que o resto da aplicação. Em aplicações RMI reais isto não é necessário, mas é preciso definir a propriedade java.rmi.server.codebase contendo os caminhos onde se pode localizar o código.


9. Iniciar o servidor de objetos
Entre na parta servidor e execute o servidor , note que enquanto isso o RMIRegistry tem que continuar ativo portanto não feche o terminal do RMIRegistry. Abra outro terminal para colocar o servidor no ar.


10. Iniciar o cliente 
Entre na pasta cliente e coloque o cliente para rodar , na primeira vez que ele rodar ele deve retornar e imprimir a seguinte string na tela Mensagem recebida : inicial  . Se você rodar o cliente mais uma vez ele pega a mensagem atualizada Mensagem recebida : Fulano esteve aqui . Ou seja se você examinar o codigo no primeiro acesso ao objeto remoto o cliente executa a operação mens.setMensagem("Fulano esteve aqui!") mudando dessa forma a String armazenada no objeto remoto , quando você executa o comando pela segunda vez ele pega essa nota String já atualizada.


Observações


Antes de rodar as aplicações ( cliente e servidor ) tenha certeza que você tem todos os arquivos necessários ,  implementar primeiramente os programas da maneira que foi sugerido facilita inicialmente o desenvolvimento e teste da aplicação , para testar o cliente e o servidor em maquinas diferente basca pegar o conteúdo da pasta cliente e implantar em uma nova maquina , depois entre no codigo fonte da aplicação cliente e modifique o numero IP da maquina onde está rodando o RMIRegistry , recompile os arquivos e pode testar . Abaixo veja a lista dos arquivos que devem estar presentes tanto na pasta servidor quanto cliente antes de você rodar a aplicação.

Fonte : Curso Programação Orientada a Objetos usando Java da empresa Argonavis , Unidade 20 Fundamentos de Objetos remotos (java.rmi). Link

Por favor poste seus comentarios  :-)

Comentários

Postar um comentário

Ajude o blog a melhorar comente!!!

Postagens mais visitadas deste blog

Projetos em Sala de aula

A educação baseada em projetos vem sendo usada como uma metodologia poderosa para melhor preparar estudantes do século 21, já que leva os alunos a trabalhar em conjunto, se organizar, pesquisar e executar harmonicamente. Porém, antes de levar a metodologia para a sala de aula, será que os professores sabem como e quais projetos trabalhar em suas disciplinas? Uma dessas novidades é o  PBLU (Project Based Learning University ), plataforma gratuita que ajuda a capacitar professores para o uso de projetos em suas disciplinas, como uma forma de agregar conteúdo e motivar os estudantes. Conheça os oito pontos principais para um bom programa de aprendizagem baseada em projeto: Ter conteúdo relevante.   O objetivo da abordagem é trabalhar os conceitos-chave das disciplinas acadêmicas a partir de um projeto. Desenvolver habilidades para o século 21.   Ao longo do projeto, os alunos deverão buscar uma resposta a um problema. Para isso, eles deverão buscar referências...

Video Aulas de Java já disponíveis no 4Shared

Turma segue as video aulas já disponíveis para download no 4Shared , espero que vocês gostem das aulas e por favor postem um comentario no blog dizendo o que vc's acharam preciso desse feed back para o constante aprimoramento das aulas . Basta escolher o arquivo clickar  no link para download ( tenha paciencia os arquivos são grandes ) <p>&lt;p&gt;&amp;amp;amp;amp;lt;p&amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;lt;br&amp;amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;amp;lt;br&amp;amp;amp;amp;amp;amp;amp;gt;se&amp;amp;amp;amp;lt;/p&amp;amp;amp;amp;gt;&lt;/p&gt;</p> Se a Janela de Download acima não funcionar tente acessar os arquivos usando o seguinte link http://www.4shared.com/dir/34812571/bf01348d/VideoAulas.html Bom estudo  :-)

Sistemas distribuidos: Enviando mensagens TCP Parte II - Servidor

Igual ao servidor UDP esse servidor só vai receber a mensagem e envia-la de volta , ou seja é um servidor de ECO mas com boa vontade basta fazer algumas alterações que vc tem um servidor de chat :-) . Server TCP: import java.net.*; import java.io.*; public class TCPServer { public static void main(String[] args) { try { int serverPort = 7896; ServerSocket listenSocket = new ServerSocket(serverPort); //socket de escuta o socket que vai atender as requisições while(true){ Socket client = listenSocket.accept( ); Connection c = new Connection(client); //precisamos criar a classe conection que vai //inicializar nossas threads para atender a cada requisição } } catch (IOException e) { System.out.println("Listem :" + e.getMessage( )); } }//fim do main }//fim da classe Depois de fin...