por Paulo César M. JeveauxExtraído do site : http://www.portaljava.com.brRMI (Remote Method Invocation) é uma forma que Ja...
Para o servidor receber a informação que está no stub, ele cria um objetoskeleton. O skeleton executa as seguintes ações:*...
Primeiro Programa RMIO primeiro arquivo a analisar é a interface apresentada no arquivo Hello.java.Esta interface informa ...
public static void main(String[] args) {          System.setSecurityManager(new RMISecurityManager());         try {      ...
O cliente RMI está implementado através de um applet, na classe HelloApplet.import java.awt.*;import java.rmi.*;public cla...
O applet, ao ser inicializado, chama o método init(). Este por sua vez cria umobjeto Hello, a partir de um cadastro em uma...
IMPORTANTE: Para trabalhar com RMI, mesmo em um único computador, énecessário que o computador tenha disponível os serviço...
Upcoming SlideShare
Loading in...5
×

RMI em Java

1,818

Published on

Aprenda um pouco sobre RMI - Invocação de métodos remotos

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,818
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
74
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

RMI em Java

  1. 1. por Paulo César M. JeveauxExtraído do site : http://www.portaljava.com.brRMI (Remote Method Invocation) é uma forma que Java adotou para trabalharcom objetos Java/Java distribuídos. A idéia básica do RMI é obter um conjuntode objetos colaboradores que se comuniquem através de uma rede.Para entender as aplicações RMI, vamos analisar um problema: supondo aexistência de sistema bancário implementado em Java. Neste sistema, cadaterminal bancário pode requerer informações dos clientes do banco para umcentro de informações. Estas informações, uma vez obtidas, devem retornar aoterminal. Sob o ponto de vista de programação, pode se pensar que o terminalbancário é o cliente e o centro de informações é o servidor.A implementação deste problema pode ser realizada de várias formas, taiscomo:* Abrir uma conexão através de sockets para o envio de dados puros;* Utilizar JDBC caso o servidor tenha as informações implementadas em umbanco de dados relacional;* Utilizar outras tecnologias como CORBA (Common Object Request BrokerArchitecture), caso se esteja trabalhando com aplicativos Java/Java eJava/outras linguagens como C++ e SmallTalk;* Ou implementar o pedido e a resposta da informação como objetos. Nestemodelo, através de RMI, os objetos podem ser transportados entre o cliente e oservidor.Com RMI é possível transportar objetos pela rede e também chamar métodosque estejam em outro computador, mantendo o objeto na máquina remota.Supondo que o código do computador cliente invoca um método de um objetono servidor. Para um cliente invocar um método RMI, ele cria um objeto stubque encapsula o pedido do cliente em um pacote de bytes composto por:* Um identificador do objeto remoto a ser usado;* Um número de operação para descrever o método a ser invocado;* Um conjunto de parâmetros codificados (marshalling – processo decodificação dos parâmetros para um formato apropriado para o transporte derede).
  2. 2. Para o servidor receber a informação que está no stub, ele cria um objetoskeleton. O skeleton executa as seguintes ações:* Decodifica os parâmetros;* Chama o método desejado;* Captura o valor de retorno ou exceção e codifica (marshalling);* Retorna o valor codificado para o cliente.O stub decodifica o valor de retorno do servidor, que pode ser uma exceção,mas que em geral é o retorno da chamada do método remoto.Deve-se ter um cuidado especial no momento em que não estão mais sendoutilizados os objetos remotos. Isto porque o Garbage Collection não podedetectar ligações de objetos remotos não referenciados. Desta forma asligações devem ser explicitamente quebradas pelo programador.Sempre que é evocado um método remoto, as classes stub e skeleton serãocarregadas com um gerenciador de segurança, que determina o que umaclasse pode fazer. Semelhante aos gerenciadores de segurança dos browsers.O gerenciador de segurança é definido pelo programador, no momento daimplementação do programa. Java já dispõe de gerenciadores de segurançabastante eficazes, porém, o programador pode criar novos gerenciadores, casoache necessário.Para realizar uma operação RMI, é preciso criar, tanto do lado do cliente,quanto do lado do servidor, uma interface para o objeto que será referenciado.Isto porque o cliente, embora não tenha o objeto real, que está no servidor,deve saber as ações que pode executar sobre este objeto (o protocolo).
  3. 3. Primeiro Programa RMIO primeiro arquivo a analisar é a interface apresentada no arquivo Hello.java.Esta interface informa a existência de um único método: sayHello(), estemétodo tem a função de retornar uma String para um objeto remoto.Todas as interfaces RMI, devem ser derivadas da classe java.rmi.Remote edevem ter o tratamento de suas exceções realizadas através dajava.rmi.RemoteException, para que as exceções sejam repassadasremotamente.public interface Hello extends java.rmi.Remote { String sayHello() throws java.rmi.RemoteException;}O arquivo HelloImpl.java contém a classe HelloImpl, que implementa ainterface Hello no servidor.HelloImpl é uma subclasse da classe UnicastRemoteObject que é derivada daclasse RemoteServer. A RemoteServer é uma classe abstrata, utilizada para aimplementação de RMI pela linguagem Java. Esta classe inicia uma thread,que metem o objeto HelloImpl ativo, a fim de que clientes possam se conectarao programa.import java.rmi.*;import java.rmi.server.UnicastRemoteServer;public class HelloImpl extends UnicastRemoteServer implements Hello { private String nome; public HelloImpl(String s) throws java.rmi.RemoteException { super(); nome = s; } public String sayHello() throws RemoteException { return “Hello World !!!”; }
  4. 4. public static void main(String[] args) { System.setSecurityManager(new RMISecurityManager()); try { HelloImpl obj = new HelloImpl(“HelloServer”); Naming.rebind(“HelloServer”, obj); System.out.println(“HelloImpl foi criado e registrado”); } catch(Exception e) { System.out.println(“Ocorreu uma exceção no servidor”); e.printStacktrace(); } }}Ao ser criada a classe HelloImpl, o gerenciador de segurança RMI(RMISecurityManager) é criado e instalado através do código:System.setSecurityManager(new RMISecurityManager());O objeto obj, passa a ser construído, com o construtor da classe, e cadastradono sistema operacional, através do método rebind(String str, Remote r) daclasse Naming. A classe Naming fornece um mecanismo para obter referenciasa objetos remotos baseados na sintaxe da URL. Onde uma URL para objetosremotos é usualmente especificada pelo Host, porta e nome:rmi://host:porta/nome.Naming.rebind(“HelloServer”, obj);
  5. 5. O cliente RMI está implementado através de um applet, na classe HelloApplet.import java.awt.*;import java.rmi.*;public class HelloApplet extends java.Applet.Applet { String mensagem = “”; Public void init() { try { Hello obj = (Hello)Naming.lookup(“//”+getCodeBase().getHost() + “/HelloServer”); mensagem = obj.sayHello(); } catch(Exception e) { System.out.println(“Ocorreu uma exceção”); e.printStackTrace(); } } public void paint(Graphics g) { g.drawString(mensagem, 25, 50); }}
  6. 6. O applet, ao ser inicializado, chama o método init(). Este por sua vez cria umobjeto Hello, a partir de um cadastro em uma máquina Remota (servidor). Paratanto, fornece a URL deste objeto para o método lookup(String url). Como estemétodo retorna genericamente um objeto do tipo Remote, deve ser colocadoum cast explícito para o objeto que está sendo criado, no caso (Hello).Hello obj = (Hello)Naming.lookup(“//”+getCodeBase().getHost() +“/HelloServer”);Através da interface, a classe cliente pode ter conhecimento dos métodos quepode evocar remotamente. Neste caso apenas o método abaixo:mensagem = obj.sayHello();A mensagem será exibida através do método drawString(String s, int x, int y),sempre que o browser chamar o método paint(Graphics g).Para executar o programa, foi criado um arquivo de batch chamado de Run.bat.Este arquivo contém as seguintes linhas:javac *.javastart /min rmiregistryrmic HelloImplstart java HelloImplpauseappletviewer cliente.htmlA instrução javac *.java força a compilação de todos os arquivos .java paragerar os arquivos .class.A instrução start /min rmiregistry, serve para ativar o serviço de registros deS.O. para que a classe possa ser registrada no servidor.A instrução rmic HelloImpl cria automaticamente as classes necessárias paragerar os objetos stub e skeleton. Neste caso em específico serão geradas asclasses: HelloImpl_Stub.class e HelloImpl_Skel.class.A instrução start java HelloImpl inicia o servidor em um processo separado.Para terminar o processo basta pressionar CTRL-C.A instrução appletviewer cliente.html inicia o cliente através da chamada deuma página HTML eu contém o applet descrito acima. Este applet, por sua vez,chamará o método remoto.
  7. 7. IMPORTANTE: Para trabalhar com RMI, mesmo em um único computador, énecessário que o computador tenha disponível os serviços de rede TCP/IP.Leia mais em: Tutorial RMI - Invocação remota de métodoshttp://www.devmedia.com.br/tutorial-rmi-invocacao-remota-de-metodos/4493#ixzz1wMhrsEP8

×