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 interface2. 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 remotojá 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 :-)
O seu exercício é um show, não deu nenhum erro. Excelente.
ResponderExcluir