JavaTM RMI - Remote Method Invocation Java e Engenharia de Software Orientada a Objetos por Jorge H. C. Fernandes ([email protected]) CESAR-DI-UFPE Julho de 1999 Objetivos desta Aula Mostrar o modelo de serialização/desserialicação de objetos Java Descrever o modelo computacional de RMI em Java Criar pequenos exemplos de uso de RMI Integrar o uso de RMI com o applet BancoDeJava Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Referências Java RMI Tutorial Página Java RMI http://java.sun.com/products/jdk/rmi/index.h tml Especificações Java RMI e Serialization Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Especificação da API java.rmi Principais classes java.rmi.activation Ativação de objetos sob demanda java.rmi.dgc Classes e interfaces para coletor de lixo distribuído java.rmi.registry Registro de objetos java.rmi.server Implementação básica de servidores RMI Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Java RMI Serialização Visão Geral: Objetos Distribuídos com RMI Registro de Objetos em um Servidor Localização de Objetos Remotamente Localizados Comunicação com Objetos Remotos Carga de Novas Classes Criando Aplicações Distribuídas com RMI Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Serialização/Deserialização Serialização Processo de gerar uma cadeia de bytes que representa o estado de um objeto Deserialização Processo de ler uma cadeia de bytes que contém um objeto serializado e recriar em memória um novo objeto com o mesmo estado do objeto que foi serializado Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Exercício: Serialização/Deserialização Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) O Modelo Computacional RMI Remote C1 Naming StubA RemoteB RemoteA X registry ServerA StubB ServerB StubB StubA Cliente RMI C1 Remote C2 Serializable Remote Naming X StubA RemoteA X X RemoteB RemoteA Class StubB Server StubA StubA ServerB ServerA Cliente RMI C2 HOST Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Transferência de Código via RMI (Fonte: Java Tutorial, 1999) Cliente RMI 2 - Cliente busca no host um proxy para o objeto remoto, através do nome registry 1 - Objeto Servidor registra-se com um nome (String) conhecido pelo cliente 3 - O registry retorna uma instância do proxy 4 - Cliente busca a classe do proxy (stub) 5 - Servidor de classes (normalmente um servidor http) retorna a classe do proxy (stub) Servidor RMI Servidor de Classes (http, ftp, etc) Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Criando Aplicações com RMI Definindo interfaces entre servidor e clientes Implementando o servidor Compilando o servidor e gerando tocos Disponibilizando interface e tocos através de um servidor http Implementando e compilando um cliente Executando o cliente Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Definindo interfaces entre servidor e clientes import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote { String sayHello() throws RemoteException; } Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Implementando Servidor (1/3) import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; import java.rmi.server.UnicastRemoteObject; import java.net.InetAddress; import java.net.UnknownHostException; public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl() throws RemoteException; public String sayHello() throws RemoteException; public static void main(String args[]); } Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Implementando Servidor (2/3) ... public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl() throws RemoteException { super(); } public String sayHello() { String localHost = "Unknown Host!"; try { localHost = InetAddress.getLocalHost().toString(); } catch ( UnknownHostException uhe) { } return "Hello World!"+"\nYou are receiving text from "+localHost; } Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Implementando Servidor (3/3) public static void main(String args[]) { // Cria e instala um security manager if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { HelloImpl obj = new HelloImpl(); // Liga este objeto ao nome "HelloServer” Naming.rebind("HelloServer", obj); System.out.println("HelloServer bound in registry"); } catch (Exception e) { System.out.println("HelloImpl err: " + e.getMessage()); e.printStackTrace(); } } Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Compilando o Servidor e Gerando os tocos >javac HelloImpl.java >dir HelloImpl.java HelloImpl.class Hello.class >rmic -d . HelloImpl >dir HelloImpl.java HelloImpl.class Hello.class HelloImpl_Stub.class HelloImpl_Skel.class Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Disponibilizando interface e tocos através de um servidor >cp Hello.class HelloImpl_*.class ~jhcf/public_html/rmi > Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Implementando um cliente RMI (Applet) 1/3 import java.applet.Applet; import java.awt.Graphics; import java.rmi.Naming; import java.rmi.RemoteException; public class HelloApplet extends Applet { String message = "blank"; // "obj" is the identifier that we'll use to refer // to the remote object that implements the "Hello” // interface Hello obj = null; public void init() {...} public void paint(Graphics g) {...} } Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Implementando um cliente RMI (2/3) public void init() { try { obj = (Hello)Naming.lookup("//" + getCodeBase().getHost() +":1099/HelloServer"); message = obj.sayHello(); } catch (Exception e) { System.out.println("HelloApplet exception: " + e.getMessage()); e.printStackTrace(); } } public void paint(Graphics g) { g.drawString(message, 25, 50); } } Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Implementando um cliente RMI (3/3) HelloApplet.html <HTML> <title>Hello World Applet com RMI</title> <center> <h1> Hello World Applet com RMI </h1> </center> A Mensagem Vinda do HelloServer é: <p> <applet code="HelloApplet” width=500 height=120> </applet> </HTML> Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Compilando e instalando o Cliente >javac HelloApplet.java >dir HelloApplet.java Hello.class HelloApplet.html >dir HelloApplet.java HelloApplet.class Hello.class HelloApplet.html > >cp HelloApplet.* Hello.class ~/public_html/jhcf/rmi > Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Executando o servidor e o cliente Servidor >setenv CLASSPATH >cd >rmiregistry & >source .cshrc >java -Djava.rmi.server.codebase=http://www.di.ufpe.br/~jhcf/rmi/ -Djava.security.policy=policy HelloImpl Cliente >appletviewer http://~jhcf/rmi/HelloApplet.html Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Exercícios: Hello World Crie e compile a interface Hello Crie o servidor HelloImpl Compile o servidor, gere os stubs e os coloque na área publica do servidor de classes Crie o cliente (applet e página HTML) e o coloque em uma área pública do servidor de classes Execute o servidor HelloImpl na mesma máquina do registry e do servidor de classes Execute o applet em uma máquina qualquer Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) Um Exemplo mais Complexo: O Banco de Java Applet ~jhcf/JavaDeployment/bancov1 Servidor RMI ~jhcf/ JavaDeployment/ServerBancoRMI Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes ([email protected]) FIM