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
Download

24 slides