Post on 13-Oct-2020
JavaTM RMI - Remote Method InvocationJava e Engenharia de Software Orientada a Objetos
por Jorge H. C. Fernandes (jhcf@di.ufpe.br)CESAR-DI-UFPEJulho de 1999
Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)
Objetivos desta Aula
�Mostrar o modelo de serialização/desserialicaçãode 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 (jhcf@di.ufpe.br)
Referências
�Java RMI Tutorial�Página Java RMI
�http://java.sun.com/products/jdk/rmi/index.html
�Especificações Java RMI e Serialization
Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
Exercício: Serialização/Deserialização
Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)
StubB
O Modelo Computacional RMI
HOST
StubA
StubA
registry
ClassServer
ServerA
StubB
RemoteB
ServerB
RemoteA
Naming
Remote
Remote
StubAStubB
RemoteB RemoteA
StubA
StubA
X
X
X
ServerA
ServerB
X
SerializableCliente RMI C1
C1
Naming
Cliente RMI C2
Remote
RemoteA
C2
Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)
Transferência de Código via RMI (Fonte: Java Tutorial, 1999)
ClienteRMI registry
ServidorRMI
Servidorde Classes
(http, ftp, etc)
1 - Objeto Servidor registra-se com um nome (String) conhecido pelo cliente
2 - Cliente busca no hostum proxy para o objeto remoto, através do nome
3 - O registry retorna uma instância do proxy
4 - Cliente busca a classedo proxy (stub)
5 - Servidor de classes(normalmente um servidor http) retorna a classe do proxy (stub)
Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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 UnicastRemoteObjectimplements 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 (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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”// interfaceHello obj = null;public void init() {...}public void paint(Graphics g) {...}
}
Java e Engenharia de Software Orientada a Objetos. Copyright © 1999, Jorge H. C. Fernandes (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
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 (jhcf@di.ufpe.br)
Um Exemplo mais Complexo: O Banco de Java
�Applet�~jhcf/JavaDeployment/bancov1
�Servidor RMI�~jhcf/ JavaDeployment/ServerBancoRMI
FIM