<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wx="http://ilps.science.uva.nl/WikiXML/wx" xml:lang="pt" lang="pt">
<head>
<title>Java &amp; RMI</title>
<meta name="wx_namespace" content="0"/>
<meta name="wx_pagename" content="Java_&amp;_RMI"/>
<meta name="wx_page_id" content="1436200"/>
</head>
<body>
<div id="wx_article">
<wx:section level="1" title="Java &amp; RMI" id="wxsec1"><h1 class="pagetitle" id="wx1">Java &amp; RMI</h1>

<wx:template id="wx_t1" pagename="Predefinição:Wikificação" page_id="72391"/>
<table class="caixa infodestaque" id="wx2">
<tr id="wx3">
<td width="30px" id="wx4">
<div style="position: relative; width: 45px; height: 45px; overflow: hidden" id="wx5">
<div style="position: absolute; top: 0px; left: 0px; font-size: 100px; overflow: hidden; line-height: 100px; z-index: 3" id="wx6"><a href="/wpt/Wikipedia:Wikifica%C3%A7%C3%A3o" title="Wikipedia:Wikificação" wx:linktype="known" wx:pagename="Wikipedia:Wikificação" id="wx7">   </a></div>

<div style="position: absolute; top: 0px; left: 0px; z-index: 2" id="wx8"><a href="/wpt/Imagem:Wiki_puzzle.svg" title="Wikipedia:Wikificação " wx:linktype="image" wx:pagename="Imagem:Wiki_puzzle.svg" id="wx9"><img src="/wpt/Imagem:Wiki_puzzle.svg" alt="Wikipedia:Wikificação " width="45" id="wx10"/></a></div>
</div>
</td>
<td id="wx11"><b id="wx12">Este artigo ou seção precisa ser <i id="wx13"><a href="/wpt/Wikipedia:Wikifica%C3%A7%C3%A3o" title="Wikipedia:Wikificação" wx:linktype="known" wx:pagename="Wikipedia:Wikificação" id="wx14">wikificado</a></i>.</b><br id="wx15"/>
<p id="wx16">Por favor ajude a <a href="/wpt/Ajuda:Guia_de_edi%C3%A7%C3%A3o/Formata%C3%A7%C3%A3o" title="Ajuda:Guia de edição/Formatação" wx:linktype="known" wx:pagename="Ajuda:Guia_de_edição/Formatação" id="wx17">formatar</a> este artigo de acordo com as diretrizes estabelecidas no <a href="/wpt/Wikipedia:Livro_de_estilo" title="Wikipedia:Livro de estilo" wx:linktype="known" wx:pagename="Wikipedia:Livro_de_estilo" id="wx18">livro de estilo</a>. <small id="wx19">(Fevereiro de 2008)</small></p>
</td>
</tr>
</table>

<wx:templateend start="wx_t1"/><wx:template id="wx_t2" pagename="Predefinição:Sem-fontes" page_id="269210"/>
<table class="caixa aviso" style="margin-bottom: 10px;" id="wx20">
<tr id="wx21">
<td width="30px" id="wx22">
<div style="position: relative; width: 30px; height: 30px; overflow: hidden" id="wx23">
<div style="position: absolute; top: 0px; left: 0px; font-size: 100px; overflow: hidden; line-height: 100px; z-index: 3" id="wx24"><a href="/wpt/Wikipedia:Livro_de_estilo/Cite_as_fontes" title="Wikipedia:Livro de estilo/Cite as fontes" wx:linktype="known" wx:pagename="Wikipedia:Livro_de_estilo/Cite_as_fontes" id="wx25">   </a></div>

<div style="position: absolute; top: 0px; left: 0px; z-index: 2" id="wx26"><a href="/wpt/Imagem:Nuvola_apps_important.svg" title="Wikipedia:Livro de estilo/Cite as fontes " wx:linktype="image" wx:pagename="Imagem:Nuvola_apps_important.svg" id="wx27"><img src="/wpt/Imagem:Nuvola_apps_important.svg" alt="Wikipedia:Livro de estilo/Cite as fontes " width="30" id="wx28"/></a></div>
</div>
</td>
<td id="wx29"><b id="wx30">ATENÇÃO: Este artigo ou secção não cita as suas <a href="/wpt/Wikipedia:Livro_de_estilo/Cite_as_fontes" title="Wikipedia:Livro de estilo/Cite as fontes" wx:linktype="known" wx:pagename="Wikipedia:Livro_de_estilo/Cite_as_fontes" id="wx31">fontes ou referências</a>, em desacordo com a <a href="/wpt/Wikipedia:Verificabilidade" title="Wikipedia:Verificabilidade" wx:linktype="known" wx:pagename="Wikipedia:Verificabilidade" id="wx32">política de verificabilidade</a>.</b>
<p id="wx33">Ajude a melhorar este artigo providenciando <a href="/wpt/Wikipedia:Fontes_fi%C3%A1veis" title="Wikipedia:Fontes fiáveis" wx:linktype="known" wx:pagename="Wikipedia:Fontes_fiáveis" id="wx34">fontes fiáveis</a> e independentes, inserindo-as no corpo do texto ou em <a href="/wpt/Wikipedia:Livro_de_estilo/Notas_de_rodap%C3%A9" title="Wikipedia:Livro de estilo/Notas de rodapé" wx:linktype="known" wx:pagename="Wikipedia:Livro_de_estilo/Notas_de_rodapé" id="wx35">notas de rodapé</a>.</p>
</td>
</tr>
</table>

<wx:templateend start="wx_t2"/>
<p id="wx36"><b id="wx37">O que é RMI?</b></p>

<dl id="wx38">
<dd id="wx39">
<p id="wx40">RMI ou Remote Method Invocation existe na tecnologia Java a partir da versão JDK 1.1, utilizada para criar programas aplicações distribuídas na tecnologia Java. Possibilitando ao programador invocar métodos remotos de outras Java Virtual Machines (Maquinas virtuais Java), que podem ou não existir em diferentes host. Outra característica do RMI é que ele usa serialização de objetos para ordenar os parâmetros e não precisa truncar os dados, podendo utilizar o real polimorfismo orientado a objetos.</p>
</dd>
</dl>

<p id="wx41"><b id="wx42">O que é Java?</b></p>

<dl id="wx43">
<dd id="wx44">
<p id="wx45">Java é alem de uma linguagem de programação, uma plataforma. A linguagem Java contem varias qualidades muito procuradas na atualidade para as mais diferenciadas aplicações, dentre elas estão:</p>
</dd>
</dl>

<ul id="wx46">
<li id="wx47">
<p id="wx48">É uma linguagem simples de lidar</p>
</li>

<li id="wx49">
<p id="wx50">É uma linguagem Orientada a Objeto</p>
</li>

<li id="wx51">
<p id="wx52">É uma linguagem Distribuída</p>
</li>

<li id="wx53">
<p id="wx54">É uma linguagem portável</p>
</li>

<li id="wx55">
<p id="wx56">É uma linguagem segura</p>
</li>
</ul>

<p id="wx57"><b id="wx58">Por que foi criado o RMI?</b></p>

<dl id="wx59">
<dd id="wx60">
<p id="wx61">Para uma tecnologia avançada como o Java, ficar fora do mercado de sistemas distribuídos seria um furo muito grande. Com isso em mente os criadores do RMI mapearam cuidadosamente a maneira que as classes e objetos Java trabalhavam em uma única Java Virtual Machine. Visando expandir este conceito para uma visão de sistemas distribuídos, aonde classes e objetos trabalhariam com múltiplas JVM’s.</p>
</dd>

<dd id="wx62">
<p id="wx63">Utilizando a mesma sintaxe de orientação a objetos locais, os desenvolvedores conseguiram criar uma sintaxe similar para objetos remotos.</p>
</dd>
</dl>

<p id="wx64"><b id="wx65">Como funciona o RMI?</b></p>

<dl id="wx66">
<dd id="wx67">
<p id="wx68">A arquitetura RMI é relativamente bem simples, por mais que ela proponha um novo paradigma para os programadores, ela segue a mesma idéia de orientação a objetos locais, com algumas pequenas diferenças.</p>
</dd>

<dd id="wx69">
<p id="wx70">Antes de iniciarmos, uma coisa deve ficar clara. A definição e a implementação do comportamento são conceitos separados, podendo ser definidos e implementados em JVM’s diferentes. A implementação fica por conta de uma classe, enquanto a definição fica em uma interface Java. Lembrando que, em Java, uma interface define o comportamento e uma classe define uma implementação.</p>
</dd>

<dd id="wx71">
<p id="wx72">Veja o desenho abaixo:</p>
</dd>
</dl>

<p id="wx73"><a href="/wpt/Imagem:Sisdis1.JPG" title="Imagem:Sisdis1.JPG" wx:linktype="image" wx:pagename="Imagem:Sisdis1.JPG" id="wx74"><img src="/wpt/Imagem:Sisdis1.JPG" alt="Imagem:Sisdis1.JPG" id="wx75"/></a></p>

<dl id="wx76">
<dd id="wx77">
<p id="wx78">O programa chama o método que esta declarado na interface, o servidor ao ouvir o pedido executa o método, e caso exista um retorno devolve o valor para o Cliente.</p>
</dd>
</dl>

<p id="wx79"><b id="wx80">RMI em camadas.</b></p>

<dl id="wx81">
<dd id="wx82">
<p id="wx83">O RMI também pode ser implementado em camadas, como veremos no desenho abaixo:</p>
</dd>
</dl>

<p id="wx84"><a href="/wpt/Imagem:Sisdis2.JPG" title="Imagem:Sisdis2.JPG" wx:linktype="image" wx:pagename="Imagem:Sisdis2.JPG" id="wx85"><img src="/wpt/Imagem:Sisdis2.JPG" alt="Imagem:Sisdis2.JPG" id="wx86"/></a></p>

<dl id="wx87">
<dd id="wx88">
<p id="wx89">A camada aonde se encontram os Stubs e os Skeletons são as primeiras, pois elas que interceptam as chamadas feitas pelos clientes, para que a mesma seja enviada pra o servidor responsável pela execução do método requisitado.</p>
</dd>

<dd id="wx90">
<p id="wx91">A segunda camada, Remote Reference Layer, contem uma conexão de um – para - um (Unicast), e é responsável por interpretar e gerenciar referencias feitas dos clientes para os objetos remotos dos servidores.</p>
</dd>

<dd id="wx92">
<p id="wx93">A terceira camada é a camada de transporte, responsável por enviar e devolver as requisições. Esta camada trabalha com conexões TCP/IP.</p>
</dd>
</dl>

<p id="wx94"><b id="wx95">Aonde esta o método que eu procuro?</b></p>

<dl id="wx96">
<dd id="wx97">
<p id="wx98">Uma duvida muito comum deve ser, Como faço para saber em qual servidor encontrar o método que preciso?</p>
</dd>

<dd id="wx99">
<p id="wx100">Como diriam os otimistas, respostas simples para perguntas simples. O RMI contem um registro aonde ficam guardados os dados de servidores e seus métodos, chamada RMI registry que roda em cada uma das maquinas que hospeda um serviço remoto (método), por padrão na porta 1099.</p>
</dd>

<dd id="wx101">
<p id="wx102">Quando um servidor é executado, ele cria um serviço remoto e fica escutando até o momento que alguém faça uma requisição deste serviço. Para tal, primeiramente ele instancia o objeto que provem o serviço, depois ele exporta o objeto para o RMI, que por sua vez o adiciona no registro com um nome publico.</p>
</dd>

<dd id="wx103">
<p id="wx104">Para que o cliente possa recuperar o caminho para este objeto, ele deve utilizar a classe estática Naming, que provem o objeto Lookup(), utilizado para procurar o registro que se pretende utilizar.</p>
</dd>
</dl>

<p id="wx105"><b id="wx106">Como as duas tecnologias interagem?</b></p>

<dl id="wx107">
<dd id="wx108">
<p id="wx109">Vamos demonstrar agora o exemplo encontrado no site da SUN, na parte de tutoriais, sobre a criação e utilização de um RMI.</p>
</dd>
</dl>

<pre id="wx110">
//Interface

package example.hello; 

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Hello extends Remote {
   String sayHello() throws RemoteException;
}
</pre>

<p id="wx111">Um objeto remoto é a instancia de uma classe que implementa uma interface remota. Uma interface remota estende a interface java.rmi.Remote, e declara um conjunto de métodos remotos. Considerando que toda chamada de metodos pode falhar, com metodos remotos esta chance é ainda maior, considerando problemas com redes, ou problemas de comunicação, todos os metodos remotos devem declarar o retorno da exce~ção java.rmi.RemoteException.</p>

<pre id="wx112">
//Server

/**
* Neste exemplo o metodo main é declarado, na classe Server, juntamente com 
* a interface Hello.
* O metodo Main é responsavel por criar e exportar um objeto remoto, e 
* registrar o objeto na Java RMI Registry
*/
package example.hello;

import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Server implements Hello {

   public Server() {
   }

   public String sayHello() {
      return "Hello, world!";
   }
     
   public static void main(String args[]) {
     
      try {
         // Criação do objeto remoto que prove o serviço e exportação do mesmo para a java RMI Registry
         Server obj = new Server();
         Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0);
         // UnicastRemoteObject exporta o objeto em () para que o mesmo possa ser utilizado e retorna o Stub
         
         // Uma vez exportado, os clientes vão poder acessar o método via nome
        
         // Registra o cara, dando um nome para o stub desse cara no registro
         Registry registry = LocateRegistry.getRegistry();
         registry.bind("Hello", stub);
        
         System.err.println("Server ready");
      } catch (Exception e) {
         System.err.println("Server exception: " + e.toString());
         e.printStackTrace();
      }
   }
}
</pre>

<p id="wx113">A classe de implementação Server implementa a interface remota Hello, que implementa o método remoto sayHello. O método sayHello não precisa declarar que ele retorna uma exceção pois o método de implementação não retorna nenhuma exceção.</p>

<p id="wx114">Neste contexto, uma classe Servidor seria a classe que contem o metodo Main, responsavel por criar uma instancia do objeto remoto, exportar este objeto e incluir esta instancia no registro RMI do Java, via bind. A classe que implementa este metodo pode ser a propria classe que sera implementada ou uma outra classe qualquer</p>

<pre id="wx115">
//Cliente
package example.hello;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {

   private Client() {}

   public static void main(String[] args) {

   String host = (args.length &lt; 1) ? null : args[0];
      try {
         // Obtem o stub 
         Registry registry = LocateRegistry.getRegistry(host);
         // Procura pelo stub com o nome de Hello no registro
         Hello stub = (Hello) registry.lookup("Hello");
         // Conecta no Server e invoca o metodo sayHello
         String response = stub.sayHello();
         System.out.println("response: " + response);
      } catch (Exception e) {
         System.err.println("Client exception: " + e.toString());
         e.printStackTrace();
      }
   }
}
</pre>

<p id="wx116">O cliente recebe o stub do registro que esta no Host, procura o nome do stub do objeto remoto, e invoca o método sayHello utilizando o stub recebido.</p>

<a id="Refer.C3.AAncias" name="Refer.C3.AAncias"/>
<wx:section level="2" title="Referências" id="wxsec2"><h2 id="wx117">Referências</h2>

<ul id="wx118">
<li id="wx119"><a href="http://www.guj.com.br/java.tutorial.artigo.37.1.guj" class="external text" wx:linktype="external" rel="nofollow" id="wx120">Tutorial</a></li>

<li id="wx121"><a href="http://java.sun.com/j2se/1.4.2/docs/guide/rmi/" class="external text" wx:linktype="external" rel="nofollow" id="wx122">Manual</a></li>
</ul>
</wx:section></wx:section></div>
<div id="wx_categorylinks">
<a href="/wpt/index.php?title=Especial:Categories&amp;article=Java_%26_RMI" title="Especial:Categories" wx:linktype="known" wx:pagename="Especial:Categories" id="wx123">Categorias de páginas</a>: <span dir="ltr" id="wx124"><a href="/wpt/Categoria:%21Artigos_precisando_de_wikifica%C3%A7%C3%A3o_desde_Fevereiro_de_2008" title="Categoria:!Artigos precisando de wikificação desde Fevereiro de 2008" wx:linktype="known" wx:pagename="Categoria:!Artigos_precisando_de_wikificação_desde_Fevereiro_de_2008" wx:page_id="1575301" id="wx125">!Artigos precisando de wikificação desde Fevereiro de 2008</a></span> | <span dir="ltr" id="wx126"><a href="/wpt/Categoria:%21Artigos_com_trechos_que_carecem_de_fontes_desde_Fevereiro_de_2008" title="Categoria:!Artigos com trechos que carecem de fontes desde Fevereiro de 2008" wx:linktype="known" wx:pagename="Categoria:!Artigos_com_trechos_que_carecem_de_fontes_desde_Fevereiro_de_2008" wx:page_id="1554467" id="wx127">!Artigos com trechos que carecem de fontes desde Fevereiro de 2008</a></span> | <span dir="ltr" id="wx128"><a href="/wpt/Categoria:Java" title="Categoria:Java" wx:linktype="known" wx:pagename="Categoria:Java" wx:page_id="116524" id="wx129">Java</a></span> | <span dir="ltr" id="wx130"><a href="/wpt/Categoria:Programa%C3%A7%C3%A3o" title="Categoria:Programação" wx:linktype="known" wx:pagename="Categoria:Programação" wx:page_id="44412" id="wx131">Programação</a></span></div>
<div id="wx_languagelinks">
</div>
</body>
<wx:templatearguments for="wx_t1"><wx:argument name="data">
<p id="wx132">Fevereiro de 2008</p>
</wx:argument></wx:templatearguments>
<wx:templatearguments for="wx_t2"><wx:argument name="data">
<p id="wx133">Fevereiro de 2008</p>
</wx:argument></wx:templatearguments>
</html>
