https://manuais.iessanclemente.net/index.php?title=RMI&feed=atom&action=historyRMI - Historial de revisiones2024-03-29T06:21:23ZHistorial de revisiones de esta página en el wikiMediaWiki 1.36.2https://manuais.iessanclemente.net/index.php?title=RMI&diff=3703&oldid=prevArribi: /* Exemplo */2008-01-25T11:54:28Z<p><span dir="auto"><span class="autocomment">Exemplo</span></span></p>
<p><b>Página nueva</b></p><div>==Que é RMI==<br />
A tecnoloxía de Invocación Remota de Métodos (RMI) de Java permite a un obxecto que se está executando nunha Máquina Virtual Java (JVM) chamar a métodos doutro obxecto que está noutra JVM diferente, posiblemente noutro equipo. Polo tanto, pode entenderse como unha mistura entre a programación distribuída e o paradigma de orientación a obxectos, permitindo construír aplicacións que se poden executar de forma distribuída empregando unha rede TCP/IP.<br />
<br />
As aplicacións RMI normalmente comprenden dous programas separados: un servidor e un cliente. Unha aplicación servidor típica crea unha chea de obxectos remotos, fai accesibles unhas referencias a devanditos obxectos remotos, e espera a que os clientes chamen a estes métodos ou obxectos remotos. Unha aplicación cliente típica obtén unha referencia remota de un ou máis obxectos remotos no servidor e chama aos seus métodos. RMI proporciona o mecanismo polo que o cliente e o servidor se comunican e se pasan información.<br />
<br />
RMI está soportado na linguaxe Java polo paquete [http://java.sun.com/javase/6/docs/api/java/rmi/package-summary.html <code>java.rmi</code>]<br />
<br />
==Funcionamento==<br />
Grosso modo, o funcionamento de RMI é o seguinte: <br />
[[Imagen:JavaRMI.JPG|center]]<br />
*Mediante un compilador especial, o '''RMIC''', xéranse dous servidores intermedios (proxies), un da parte do cliente, chamado '''stub''', e outro da parte servidor, chamado '''skeleton''' (dende a versión Java 2 o skeleton non é necesario)<br />
*Cando o cliente invoca un método o stub envía a petición do método xunto cos seus parámetros '''serializados''' (''marshalling'' en inglés) pola rede ao skeleton. Ese paso é posible grazas ao '''Object Registry''', que é un servidor de nomes que contén obxectos e os seus nomes. É dicir, os obxectos están rexistrados no '''Registry''', mediante o cal se pode acceder a un obxecto remoto empregando o seu nome.<br />
*Despois, o skeleton '''deserializa''' os parámetros e pásaos ao servidor que, baseándose neles, obtén o resultado que se envía ao cliente polo camiño inverso.<br />
<br />
Para acceder ao RMI Registry, e polo tanto aos nomes dos obxectos, úsase a clase estática <code>Naming</code> que proporciona o método <code>lookup()</code> que o cliente usa para consultar o rexistro. O método acepta un URL que especifiza o nome do equipo e o servizo desexado. O URL ten a seguinte forma:<br />
<source lang="Java"><br />
rmi://<nome_equipo>[:<porto_nome_servizo>]/<nome_servizo> <br />
</source><br />
O porto só precisa ser especificado se é distinto de 1099.<br />
<br />
==Interfaces, obxectos e métodos remotos==<br />
Unha aplicación construída utilizando RMI, do mesmo xeito que outras aplicacións Java, está composta por interfaces e clases. Os interfaces definen métodos, mentres que as clases implementan os métodos definidos nos interfaces e, quizais, tamén definen algúns métodos adicionais. Os obxectos que teñen métodos que poden chamarse por distintas máquinas virtuais son os '''obxectos remotos'''.<br />
<br />
Un obxecto convértese en remoto implementando un interface remoto, que teña estas caracterísitcas.<br />
<br />
* O interface remoto '''herda''' do interface <code>java.rmi.Remote</code>.<br />
* Cada método do interface declara que lanza unha <code>java.rmi.RemoteException</code> ademais de calquera excepción específica da aplicación.<br />
<br />
==Pasos para crear unha aplicación RMI==<br />
Os pasos que se adoita seguir para crear unha aplicación remota usando RMI son os seguintes:<br />
#Definir os '''interfaces remotos'''. Un interface remoto especifica os métodos que se poden chamar remotamente por un cliente. Os clientes programan os interfaces remotos, non a implementación das clases de devanditos interfaces. <br />
#Implementar os '''obxectos remotos'''. Os obxectos remotos teñen que implementar un ou varios interfaces remotos. A clase do obxecto remoto pode incluír implementacións doutros interfaces (locais ou remotos) e outros métodos (que só estarán dispoñibles localmente). <br />
#Implementar os '''clientes'''. Os clientes que utilizan obxectos remotos poden ser implementados logo de definir os interfaces remotos, incluso despois de que sexan despregados os obxectos remotos .<br />
#Compilar os ficheiros de código fonte e '''xerar o stub e o skeleton'''. Este é un proceso de dous pasos. No primeiro paso, utilízase o compilador '''javac''' para compilar os ficheiros fonte, os cales conteñen as implementacións dos interfaces remotos, as clases do servidor, e do cliente. No segundo paso é utilizar o compilador '''rmic''' para crear o stub e o skeleton dos obxectos remotos.<br />
#'''Arrincar a aplicación'''. Isto inclúe executar o rexistro de obxectos remotos de RMI, o servidor e o cliente.<br />
<br />
==Carga dinámica de código==<br />
Unha das principais características de RMI é a habilidade de descargar os bytecodes dunha clase dun obxecto se a clase non está definida na máquina virtual do receptor. Os obxectos, anteriormente só dispoñibles nunha soa máquina virtual, agora poden ser transmitidos a outra máquina virtual, posiblemente remota. O comportamento de devanditos obxectos non cambia cando son enviados a outra máquina virtual. Isto permite que os novos obxectos sexan introducidos en máquinas virtuais remotas, e así estender o comportamento dunha aplicación dinamicamente.<br />
<br />
A seguinte ilustración mostra unha aplicación RMI distribuída que utiliza o rexistro para obter referencias a obxectos remotos. O servidor chama ao rexistro para asociar un nome cun obxecto remoto. O cliente busca o obxecto remoto polo seu nome no rexistro do servidor e logo chama a un método. Esta ilustración tamén mostra que o sistema RMI utiliza unha servidor Web existente para cargar os bytecodes da clase Java, desde o servidor ao cliente e desde o cliente ao servidor, para os obxectos que necesita.<br />
<br />
[[Imagen:RMI-2.gif|center]]<br />
<br />
==Exemplo==<br />
Os conceptos expostos poden verse neste [http://es.wikipedia.org/wiki/RMI#Ejemplo exemplo]<br />
<br />
==Referencias==<br />
Para ampliar información recomendo as seguintes seguintes referencias:<br />
*Páxina principal de Sun sobre RMI: [http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp]<br />
*Titorial sobre RMI da Sun Developer Network (SDN): [http://java.sun.com/developer/onlineTraining/rmi/ http://java.sun.com/developer/onlineTraining/rmi/]<br />
*API, diferentes titoriais e ferramentas de desenvolvemento: [http://java.sun.com/javase/6/docs/technotes/guides/rmi/index.html http://java.sun.com/javase/6/docs/technotes/guides/rmi/index.html]</div>Arribi