Você está na página 1de 15

Comunicação entre Processos

Unidade 5
n Processos e threads interagem para
Comunicação trabalhar conjuntamente em um sistema
entre Processos n Trocam dados / mensagens
n Utilizamos serviços de comunicação fornecidos
pela máquina e pelo S.O.
n Pipes n Seguem protocolos de comunicação para que
n Sockets possam entender uns aos outros
n RMI
n CORBA

Comunicação entre Processos Comunicação entre Processos


n Protocolos n Protocolos
n Estabelecem caminhos virtuais de Com licença… Pede conexão
comunicação entre processos / threads Pois não… Aceita conexão
n Duas entidades precisam usar os mesmos
protocolos para trocar informações Que horas são? Envia mensagem

São 8 horas. Confirma recepção

Protocolo
Obrigado! Fecha conexão

Meio de Transmissão De nada. Libera conexão


tempo
3 4

Comunicação entre Processos Comunicação entre Processos


n Serviços de comunicação n Características dos serviços de
n Serviço sem Conexão:
Conexão: cada unidade de dados comunicação entre processos/threads:
processos/threads:
é enviada independentemente das demais n Abrangência: local ou remota
n Participantes: 1 à 1, 1 à N ou M à N
+ n Tamanho das mensagens: fixo ou variá
variável;
n Serviço com Conexão: limitado ou não
Conexão: dados são enviados
através de um canal de comunicação n Sincronismo: comunicaç
comunicação sísíncrona,
assí
assíncrona ou semi-
semi-síncrona
2 Canal de Comunicação 2
5 6

1
Comunicação entre Processos Comunicação entre Processos
n APIs de comunicação n APIs de Comunicação de Sist.
Sist. Operacionais
n Permitem que aplicações troquem dados n Mecanismos fornecidos
n Fornecem primitivas de comunicação que pelos S.O.’s permitem
enviar mensagens P1 P2
podem ser chamadas a partir do código
n Provêem acesso aos serviços de comunicação,
(trechos de memória)
comunicação,
que podem assim ser usados pelas aplicações de um processo a outro
n Alguns S.O.’s permitem
Programa
que sejam criadas
áreas de memória P1 P2
API memória
compartilhadas entre
S.O.
7 dois ou mais processos 88

Comunicação entre Processos Comunicação entre Processos


n Exemplos de APIs de comunicação:
comunicação: n Mecanismos de IPC nativos do UNIX
n Pipes: canais de comunicação locais n Pipes
n Sockets: portas de comunicação locais ou de n Sockets (comunicação local ou remota)
rede (versão segura:
segura: SSL) n Mecanismos de IPC nativos do Windows
n Suportes de RPC (Remote Procedure Call):
n Pipes e Mailslots
permitem chamar procedimentos/métodos
n WinSock (comunicação local ou remota)
remotamente (ex.: RMI, CORBA, COM, …)
n Microsoft RPC (comunicação local ou remota)
n Canais de eventos:
eventos: permitem notificar threads
e processos dos eventos ocorridos no sistema n Memória compartilhada: File Mapping e
(Ex.: JMS, CORBA Notification Service, …) Dynamic Data Exchange (DDE)
n… n Object Linking and Embedding (OLE)
9 10
10

Comunicação entre Processos Comunicação entre Processos


n RPC – Chamada Remota de Procedimento n RPC – Características
n Segue o modelo Cliente/Servidor n Em geral as requisições são ponto-
ponto-a-ponto e
n Muito usado na interação entre objetos síncronas
n Objeto servidor possui interface com métodos n Dados são tipados
que podem ser chamados remotamente n Parâmetros da requisição
n Objetos clientes usam serviços de servidores
n Retorno do procedimento/método

n Exceções
Cliente Servidor
n Um objeto pode ser cliente e servidor em
… + Soma(int y, int z) {
x = Servidor.Soma(y,z); return(y+z); momentos diferentes
… * }

11 12

2
Comunicação entre Processos Comunicação entre Processos
n Notificação de Eventos n Notificação de Eventos – Características
n Eventos ocorridos são difundidos por n Envio de eventos é completamente assíncrono
produtores e entregues a consumidores n Produtor não precisa aguardar fim do envio
n Canal de eventos permite o desacoplamento – n Evento é armazenado no canal de eventos
produtor e consumidor não precisam se conhecer n Comunicação pode ser feita através de UDP
multicast ou fazendo múltiplos envios unicast
com TCP, UDP ou com um suporte de RPC
n Os eventos podem ter tamanho fixo ou
Canal de
Eventos variável,
variável, limitado ou ilimitado
Produtores de Consumidores de n Eventos podem ser tipados ou não
Eventos Eventos
13 14

Pipes Pipes
n Pipes = canais de comunicação n Disponíveis em Java através das classes
n Duas threads podem trocar dados por um pipe PipedInputStream e PipedOutputStream
à comunicação de 1 para 1 n Principais métodos:
n Threads devem rodar na mesma máquina n Criação dos Pipes:
Pipes:
virtual à comunicaç
comunicação local is = new PipedInputStream();
PipedInputStream();
os = new PipedOutputStream(is);
PipedOutputStream(is);
n Envio e recepção de bytes / arrays de bytes:
Thread 1 Thread 2
is.read
is.read(dado)
(dado)
2 PIPE 2 os.write
os.write(dado);
(dado); os.flush();
n Exceção: java.
java.io.
io.IOException
15 16

Pipes Pipes
public class Producer extends Thread {
n Uso de Pipes com fluxos (streams) de dados private DataOutputStream out;
n Criação do fluxo: private Random rand = new Random();
in = new java.
java.io.
io.DataInputStream(is);
DataInputStream(is); public Producer(PipedOutputStream os) {
out = new DataOutputStream(os); }
out = new java.
java.io.
io.DataOutputStream(os);
DataOutputStream(os); public void run() {
n Envio e recepção de dados: while (true)
try {
<tipo> var = in.read<
in.read<tipo>(); int num = rand.nextInt(1000);
out.write<tipo>(var);
out.write< out.writeInt(num);
onde <tipo> = Int, Long,
Long, Float,
Float, Double,
Double, etc. out.flush();
sleep(rand.nextInt(1000));
} catch(Exception e) { e.printStackTrace(); }
}
17 } 18

3
Pipes Pipes
public class Consumer extends Thread { public class PipeTest {
private DataInputStream in; public static void main(String args[]) {
public Consumer(PipedInputStream is) { try {
in = new DataInputStream(is); } PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = new PipedInputStream(pout);
public void run() {
while(true) Producer prod = new Producer(out);
try { Consumer cons = new Consumer(in);
int num = in.readInt();
System.out.println("Número recebido: " + num); prod.start();
} catch(IOException e) { e.printStackTrace(); } cons.start();
} } catch (IOException e) { e.printStackTrace(); }
} }
}

19 20

Pipes Sockets

n Uso de Pipes com fluxos de objetos n Socket


n Criação do fluxo: n Abstração que representa uma porta de comu-
comu-
in = new java.
java.io.
io.ObjectInputStream(is);
ObjectInputStream(is); nicação bidirecional associada a um processo
out = new java.
java.io.
io.ObjectOutputStream(os);
ObjectOutputStream(os); n Principais Tipos de Socket
n Envio e recepção de objetos:
n Socket Datagrama:
Datagrama: envia/recebe datagramas
<classe> obj = (<classe>) in.readObject
in.readObject();
();
out.writeObject
out.writeObject(obj);
(obj); sem criar conexão;
conexão; usa protocolo UDP
onde <classe> = classe do objeto lido/enviado n Socket Multicast: recebe as mensagens
n Envio e recepção de Strings:
Strings: endereçadas a um grupo;
grupo; usa UDP multicast
String str = in.readUTF
in.readUTF();
(); n Socket Stream: estabelece uma conexão com
out.writeUTF
out.writeUTF((str);
str); outro socket; usa protocolo TCP
21 22

Sockets Sockets
n Operações com Sockets Datagrama n Sockets Datagrama – Envio
n Criar um socket datagrama:
datagrama:
DatagramSocket s = new DatagramSocket(porta);
DatagramSocket(porta); try {
DatagramSocket socket = new DatagramSocket();
n Criar pacotes de dados para envio:
envio: InetAddress destino = InetAddress.getByName(
DatagramPacket pack = new DatagramPacket(msg,
DatagramPacket(msg, "127.0.0.1");
tamanho,
tamanho, destino,
destino, porta);
porta); String mensagem = "Hello";
n Enviar dados: s.send(pack);
s.send(pack); byte[] dados = mensagem.getBytes();
n Criar pacotes de dados para recepção:
recepção: int porta = 1234;
DatagramPacket pack = new DatagramPacket(msg,tam);
DatagramPacket(msg,tam); DatagramPacket pacote = new DatagramPacket(
dados, dados.length, destino, porta);
n Receber dados: s.receive(pack);
s.receive(pack); socket.send(pacote);
n Ler dados do pacote:
pacote: pack.getData()
pack.getData() } catch (SocketException e) { e.printStackTrace();
} catch (IOException e) {e.printStackTrace(); }
23 24

4
Sockets Sockets
n Sockets Datagrama – Recepção n Sockets Multicast
n Permitem o envio simultâneo de datagramas a
try {
int porta = 1234; grupos de destinatários
DatagramSocket socket = new DatagramSocket(porta); n Grupos multicast são identificados por
byte[] dados = new byte[100]; endereços IP de 224.0.0.0 a 239.255.255.255
DatagramPacket pacote = new DatagramPacket(
dados, dados.length);
socket.receive(pacote); Grupo
String mensagem = new String(pacote.getData(), 0, Multicast
pacote.getLength() );
System.out.println("Mensagem: " + mensagem);
Emissores
} catch (SocketException e) { e.printStackTrace();
} catch (IOException e) {e.printStackTrace(); }
25 26

Sockets Sockets
n Sockets Multicast n Sockets Multicast – Envio
n Vários emissores podem mandar mensagens try {
para o grupo (ou seja,
seja, mensagens vão de DatagramSocket socket = new DatagramSocket();
X emissores ® Y receptores)
receptores) InetAddress grupo = InetAddress.getByName(
"200.1.2.3");
n Emissor não precisa fazer parte do grupo para
String mensagem = "Hello";
enviar mensagens ao grupo,
grupo, e nem precisa byte[] dados = mensagem.getBytes();
saber quem são os seus membros;
membros; basta int porta = 1234;
conhecer o endereço IP do grupo DatagramPacket pacote = new DatagramPacket(
n O receptor entra em um grupo (se torna um dados, dados.length, grupo, porta);
socket.send(pacote);
membro do grupo) e passa a receber as } catch (SocketException e) { e.printStackTrace();
mensagens destinadas ao grupo } catch (IOException e) { e.printStackTrace(); }
27 28

Sockets Sockets
n Sockets Multicast – Recepção n Sockets Stream
try { n Estabelecem canais de comunicação entre
int porta = 1234; aplicações,
aplicações, permitindo troca de dados pela rede
MulticastSocket msocket = new MulticastSocket(porta); n Adotam o paradigma cliente-
cliente-servidor
InetAddress grupo = InetAddress.getByName(
"230.1.2.3"); n Cliente:
Cliente: pede para conectar ao servidor
msocket.joinGroup(grupo); n Servidor:
Servidor: aguarda conexões dos clientes
byte[] dados = new byte[100];
DatagramPacket pacote = new DatagramPacket(
dados, dados.length); +
msocket.receive(pacote); Cliente Servidor
*
System.out.println("Mensagem: " +
new String(pacote.getData(), 0, pacote.getLength()));
} catch (Exception e) {e.printStackTrace(); } 29 30

5
Sockets Sockets

n Operações com Sockets Stream no Servidor n Operações com Sockets Stream no Cliente
n Criar um socket servidor:
servidor: n Criar um socket cliente:
cliente:
ServerSocket s = new ServerSocket(porta,
ServerSocket(porta, maxClientes);
maxClientes); Socket c = new Socket( InetAddress.
InetAddress.
n Aguardar conexão:
conexão: Socket c = s.accept();
s.accept(); getByName("servidor.com "), porta );
n Obter nome do host conectado:
conectado: n Criar fluxo,
fluxo, enviar e receber dados, e fechar:
fechar:
String host = c.getInetAddress().getHostName();
c.getInetAddress().getHostName(); idem ao servidor
n Criar fluxos de comunicação:
comunicação:
ObjectInputStream in = new n Exceções geradas
ObjectInputStream(c.getInputStream());
ObjectInputStream(c.getInputStream()); n SocketException
ObjectOutputStream out = new
ObjectOutputStream(c.getOutputStream()); n UnknownHostException
ObjectOutputStream(c.getOutputStream());
n IOException
n Fechar conexão:
conexão: in.close();
in.close(); out.close();
out.close(); c.close();
c.close();
31 32

Sockets Sockets
n Sockets Stream – Servidor n Sockets Stream – Cliente
try { try {
ServerSocket s = new ServerSocket(1234, 10); Socket socket = new Socket(InetAddress.getByName(
Socket c = s.accept(); "127.0.0.1"), 1234);
ObjectOutputStream out = new ObjectOutputStream( ObjectOutputStream out = new ObjectOutputStream(
c.getOutputStream()); socket.getOutputStream());
output.flush(); output.flush();
ObjectInputStream input = new ObjectInputStream( ObjectInputStream input = new ObjectInputStream(
c.getInputStream() ); socket.getInputStream() );
String mensagem = (String) input.readObject(); String mensagem = "Olá Servidor";
String resposta = "Olá Cliente"; output.writeObject(mensagem);
output.writeObject(mensagem); output.flush();
output.flush(); String resposta = (String) input.readObject();
} catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); }
33 34

Java RMI Java RMI


n Java RMI (Remote Method Invocation) n Arquitetura RMI
n Stube Skeleton
n Fornece um suporte simples para RPC/RMI
n Camada de referência remota
n Permite que um objeto Java chame métodos n Camada de transporte
de outro objeto Java rodando em outra JVM
JVM JVM
n Solução específica para a plataforma Java Cliente Servidor

Cliente Internet Servidor Stub Skeleton


Camada de Referência Remota
JVM JVM
Camada de Transporte
35 36

6
Java RMI Java RMI
n Stub n Camada de Referência Remota
n Representa o servidor para o cliente n Responsável pela localização dos objetos nas
n Efetua serialização e envio dos parâmetros
máquinas da rede
n Permite que referências para um objeto
n Recebe a resposta do servidor,
servidor, desserializa e
servidor remoto sejam usadas pelos clientes
entrega ao cliente para chamar métodos
n Skeleton n Camada de Transporte
n Recebe a chamada e desserializa os n Cria e gerencia conexões de rede entre
parâmetros enviados pelo cliente objetos remotos
n Faz a chamada no servidor e retorna o n Elimina a necessidade do código do cliente ou
resultado ao cliente do servidor interagirem com o suporte de rede
37 38

Java RMI Java RMI


n Dinâmica da Chamada RMI n Dinâmica da Chamada RMI (cont.)
nO servidor,
servidor, ao iniciar,
iniciar, se registra no serviço de nO skeleton do servidor recebe a chamada pela
nomes (RMI Registry ) rede,
rede, desserializa os parâmetros e faz a
n O cliente obtém uma referência para o objeto chamada do método no objeto servidor
servidor no serviço de nomes e cria a stub
n O objeto servidor executa o método e retorna
n O cliente chama o método na stub fazendo
um valor para o skeleton, que o desserializa e
uma chamada local
o envia pela rede à stub do cliente
n A stub serializa os parâmetros e transmite a
n A stub recebe o valor do retorno serializado,
serializado, o
chamada pela rede para o skeleton do servidor
desserializa e por fim o repassa ao cliente

39 40

Java RMI Java RMI


n Serialização de Dados n Desenvolvimento de Aplicações com RMI
nÉ preciso serializar e deserializar os n Devemos definir a interface do servidor
parâmetros da chamada e valores de retorno nA interface do servidor deve estender
para transmiti-
transmiti-los através da rede java.
java.rmi.
rmi.Remote ou uma classe dela
n Utiliza o sistema de serialização de objetos da derivada (ex.: UnicastRemoteObject)
UnicastRemoteObject)
máquina virtual n Todos os métodos da interface devem
n Tipos predefinidos da linguagem prever a exceção java.
java.rmi.
rmi.RemoteException
n Objetos serializáveis:
serializáveis: implementam n O Servidor irá implementar esta interface
interface java.io.serializable n Stubs e skeletons são gerados pelo compilador
RMI (rmic
(rmic)) com base na interface do servidor
41 42

7
Java RMI Java RMI
n Java RMI – Interface do Servidor n Java RMI – Implementação do Servidor
nÉ implementada pelo servidor import java.rmi.*;
import java.rmi.server.*;
n É chamada pelo cliente public class HelloServer extends UnicastRemoteObject
n Estende a interface java.
java.rmi.
rmi.Remote implements HelloWorld {
public HelloServer() throws RemoteException {super();}
n Todos os métodos devem prever a exceção public String hello() throws RemoteException {
return "Hello!!!";
java.
java.rmi.
rmi.RemoteException }
public static void main(String[] args) {
public interface HelloWorld extends java.rmi.Remote { try {
public String hello() throws java.rmi.RemoteException; HelloServer servidor = new HelloServer();
} Naming.rebind("//localhost/HelloWorld", servidor);
} catch (Exception e) { e.printStackTrace(); }
}
43
} 44

Java RMI Java RMI

n Java RMI – Implementação do Cliente n RMI/IIOP


public class HelloClient { nA partir do Java 2.0, o RMI passou a permitir
public static void main(String[] args) { a utilização do protocolo IIOP (Internet Inter-
Inter-
try {
HelloWorld servidor = (HelloWorld)
ORB Protocol) do CORBA
java.rmi.Naming.lookup("//localhost/HelloWorld"); n IIOP também usa TCP/IP, mas converte os
String msg = servidor.hello(); dados para um formato padrão (seralização ou
System.out.println("Mensagem do Servidor: "+msg);
} catch (Exception e) { e.printStackTrace(); } marshalling) diferente do Java RMI
} n Com RMI/IIOP, objetos Java podem se
}
comunicar com objetos CORBA, que podem
ser escritos em outras linguagens
45 46

CORBA CORBA
n CORBA n CORBA proporciona total transparência para
n Common Object Request Broker Architecture os Objetos Distribuídos
n Transparência de Linguagem
n Padrão definido pela OMG (Object Manage-
Manage-
ment Group), que reúne cerca de 800 n Objetos implementados em várias linguagens
empresas interessadas no desenvolvimento de n Interfaces de objetos descritas em IDL
software orientado a objetos n Transparência de S.O. e Hardware

n Permite a interação entre objetos distribuídos n Implementado em várias plataformas:


Windows, Linux,
Linux, Solaris,
Solaris, AIX, HP-
HP-UX, etc.
n Fornece um suporte completo para
n Transparência de Localização dos Objetos
desenvolver aplicações distribuídas orientadas
a objetos n Referências podem apontar para objetos em
47 outras máquinas 48

8
CORBA CORBA
n IDL (Interface Definition Language) n Compilador IDL
n Usada para descrever as interfaces de objetos n Gera todo o código responsável por:
n Linguagem puramente declarativa, sem n Fazer a comunicação entre objetos
nenhuma estrutura algorítmica n Fazer o mapeamento dos tipos de dados
n Sintaxe e tipos de dados baseados em C/C++ definidos em IDL para a linguagem usada
n Define seus próprios tipos de dados, que são na implementação
mapeados nos tipos de dados de cada n Fazer as conversões de dados necessárias
linguagem de programação suportada (serialização// marshalling
na comunicação (serialização
n Mapeada para diversas linguagens dos dados)
n C, C++, Java, Delphi,
Delphi, COBOL, Python,
Python, ADA,
Smalltalk,
Smalltalk, LISP, ... 49 50

CORBA CORBA
n Interação entre objetos no CORBA n Arquitetura do ORB
n Segue o modelo Cliente-
Cliente-Servidor Cliente Implementação
de Objeto
n Cliente: faz requisições em objs.
objs. remotos
n Implementação de objeto: implementa os
CORBA
serviços descritos na sua interface
Skeleton Skeleton Adaptador
Invocação Stubs Interface IDL Dinâmico de Objetos
Cliente Implementação
Dinâmica IDL do ORB
de Objeto
Núcleo do ORB

Repositório
Object Request Broker de Interface
Repositório de
Implementação
51 52

CORBA CORBA

n Invocaç
Invocação de Operaç
Operações Remotas n Stubs IDL
n Formas de invocaç
invocação:
ão: n Gerada
eradas pelo compilador IDL com base na
n Está
descrição da interface do objeto
Estática:
tica: atravé
através de stubs e skeletons
gerados com base na descriç
descrição da n Usadas na invocação estática
interface do servidor em IDL;
IDL; ou n O cliente conhece a interface, o método e os
n Dinâmica:
inâmica: atravé
através da interface de parâmetros em tempo de compilação
invocaç
invocação dinâmica do CORBA n Skeletons IDL
n O servidor não percebe o tipo de n Gerada
eradas pelo compilador IDL
invocaç
invocação utilizado na requisiç
requisição pelo n Interface estática para os serviços (métodos)
cliente remotos executados pelo servidor
53 54

9
CORBA CORBA
n Interface de Invocação Dinâmica (DII) n Adaptador de Objetos
n Permite que o cliente construa uma invocação n Interface entre o suporte e os objetos
em tempo de execução servidores
n Elimina a necessidade das Stubs IDL n Transforma um objeto escrito em uma

n Com a DII, novos tipos de objetos podem ser linguagem qualquer em um objeto CORBA
adicionados ao sistema em tempo de execução n Usado para geração e interpretação de

n O cliente especifica o objeto, o método e os


os referências de objetos, invocação dos
parâmetros com uma seqüência de chamadas Skeletons, ativação e desativação de
n O servidor continua recebendo as requisições
implementações de objetos, etc.
através de seu skeleton IDL n Existem vá
vários tipos de adaptador de objeto
55 56

CORBA CORBA
n Portable Object Adapter (POA) n Interoperabilidade
n Adaptador padrão: torna o servidor portável n CORBA garante a interoperabilidade entre
entre implementações diferentes objetos que usem diferentes implementações
n Abstrai a identidade do objeto da sua de ORB
implementação
n Solução adotada a partir do CORBA 2.0
n Implementa políticas de gerenciamento de
n Padronizar o protocolo de comunicação e o
threads:
n uma thread por objeto
formato das mensagens trocadas
n Foi definido um protocolo geral, que é
n uma thread por requisição
n grupo (pool) de threads
especializado para vários ambientes
específicos
n etc. 57 58

CORBA CORBA
n Interoperabilidade (cont.) n Interoperab
Interoperabilidade entre CORBA e Java RMI
n Protocolo Inter-
Inter-ORB Geral (GIOP) n Une as vantagens das duas tecnologias
n Especifica um conjunto de mensagens e n Applets,
Applets, Servlets e aplicações Java podem ser
dados para a comunicação entre ORBs clientes CORBA usando RMI/IIOP ou ORB Java
n Especializações do GIOP n Mapeamentos: IDL à Java e Java à IDL
n Protocolo Inter-
Inter-ORB para Internet (IIOP): n Interoperabilidade entre CORBA e DCOM
specifica como mensagens GIOP são n Permite que objetos DCOM acessem serviços
transmitidas numa rede TCP/IP oferecidos por objetos CORBA e vice-
vice-versa
n Protocolos
Protocolos Inter-
Inter-ORB para Ambientes
Ambientes n Bridges convertem mensagens entre os
Específicos:
Específicos: permit
permitem
em a interoperabilidade ambientes, integrando o DCOM a plataformas
do ORB com outros ambientes (ex.: DCE,
DCE, nas quais ele não está disponível
ATM nativo,
nativo, etc.)
etc.) 59 60

10
CORBA CORBA
n Serviços CORBA Aplicações Distribuídas
n Coleção de serviços em nível de sistema Serviços CORBA
n Oferecem funcionalidades básicas para Nomeação Transação Consulta Segurança Notificação

utilizar e implementar os objetos de Eventos Concorrência Licenciamento Trader Gerenciamento


aplicações distribuídas
n Especificam as interfaces e casos de uso,
Ciclo de vida Relacionamento Propriedade Coleção ........

deixando a implementação de lado Persistente Externalização Tempo Replicação ........

n Estendem ou complementam as
funcionalidades do ORB Object Request Broker (ORB)

n Independentes da aplicação Sistema Operacional e Serviços de Rede


61 62

CORBA CORBA
Desenvolvimento de Aplicações
Especificação Arquivo Especificação
n do Cliente IDL do Servidor

n Passos p/ desenvolver n Passos p/ desenvolver


um servidor CORBA um cliente CORBA Compilador
IDL
n Definir a interface n Obter a IDL do
IDL do servidor servidor Código Stubs Skeletons Código
do Cliente IDL IDL do Servidor
n Compilar a IDL n Compilar a IDL do
(gerar o skeleton) servidor (gerar stub) Compilador da Compilador da

n Implementar os n Implementar o Linguagem do Cliente Linguagem do Servidor

métodos do servidor código do cliente Executável Executável


n Compilar
do Cliente do Servidor
n Compilar 01010101010101 01010101010101
01010101010101 01010101010101
n Executar n Executar 01010101010101 01010101010101
63 01010101010101 01010101010101 64

CORBA CORBA
n Elementos de uma especificação IDL n Módulos
n Módulos n Define escopo das declarações em seu interior
module ident {
n Definições de Tipos, Constantes e Exceções // declarações de tipos,
tipos, constantes e exceções
n Interfaces // declarações de interfaces
n Definiçõesde Tipos, Constantes e };
Exceções n Interfaces
n Atributos n Descrevem a interface de um objeto CORBA
n Operações (métodos)
interface ident : interfaces_herdadas {
// declarações de tipos,
tipos, constantes e exceções
// declarações de atributos e operações
65 }; 66

11
CORBA CORBA
n Exemplo: Banco n Tipos Básicos IDL
module Banco { n boolean:
oolean: tipo booleano,
booleano, valor TRUE ou FALSE
// ... n char:
char: caractere de 8 bits, padrão ISO Latin-
Latin-1
interface AutoAtendimento { n short:
hort: inteiro curto com sinal; -215 a 215-1
// ... n long:
ong: inteiro longo com sinal; -231 a 231-1
};
n unsigned short:
short: inteiro
inteiro curto sem sinal; 0 a 216-1
interface CaixaEletronico: AutoAtendimento {
// ... n unsigned long:
long: inteiro longo sem sinal; 0 a 232-1
}; n float:
loat: real curto, padrão IEEE 754/1985
}; n double:
ouble: real longo, padrão IEEE 754/1985
n octet:
ctet: 1 byte, nunca convertido na transmissão
transmissão
n any:
ny: corresponde a qualquer tipo IDL
67 68

CORBA CORBA
n Tipos Básicos IDL (cont.) n Arrays
n Object:
Object: corresponde a um objeto CORBA n Array de tamanho fixo:
fixo:
long: inteiro de 64 bits; –263 a 263-1
n long long: tipo ident [tamanho
tamanho];
n unsigned long long:
long: inteiro de 64 bits sem n Array de tamanho variável sem limite máximo
sinal; 0 a 264-1 (tamanho efetivo definido durante a execução)
execução)
n long double:
sequence <tipo> ident ;
double: real duplo longo padrão IEEE;
base com sinal de 64 bits e 15 bits de expoente n Array de tamanho variável c/ tamanho máx.:
máx.:
n wchar:
wchar: caractere de 2 bytes, para suportar sequence <tipo,tamanho> ident ;
diversos alfabetos Obs.: tipo = qualquer tipo IDL
n Obs.:

n fixed<n,
ident = identificador único da variável
fixed<n,d>: real de precisão fixa;
fixa; n algarismos
significativos e d casas decimais tamanho = número inteiro
69 70

CORBA CORBA
n Strings n Estrutura de dados (registro)
n Seqüência de caracteres sem limite de n Tipo composto por vários campos
tamanho:
tamanho: struct ident {
string ident ; // seqüência de char’s tipo ident ;
wstring ident ; // seqüência de wchar’s
// mais campos ...
n Seqüência de caracteres com tamanho
};
máximo definido:
definido:
string <tamanho> ident ; n Lista enumerada
wstring <tamanho> ident ; n Lista
com valores de um tipo
enum ident { /*lista de valores*/ };
71 72

12
CORBA CORBA
n União discriminada n Exceções
n Tipo composto com seleção de campo por n São estruturas de dados retornadas por uma
cláusula switch/
switch/case;
case; o seletor deve ser tipo operação para indicar que uma situação
IDL inteiro, char,
char, boolean ou enum anormal ocorreu durante sua execução
n Cada exceção possui um identificador e uma
union ident switch (seletor){ lista de campos que informam as
case valor : tipo ident ; condições nas quais a exceção ocorreu
// mais campos ... exception ident {
default: tipo ident ;
default: // lista de campos
}; };
n Exceções padrão do CORBA: CONCLUDED_YES,
CONCLUDED_YES,
73
CONCLUDED_NO,
CONCLUDED_NO, CONCLUDED_MAYBE 74

CORBA CORBA
n Exemplo: Banco n Atributos
module Banco { n São dados de um objeto que podem ter seu
const string NomeBanco = "UFSC";
const string Moeda = "R$"; valor lido e/ou modificado remotamente
enum Aplicacao { poupanca, fundoAcoes, rendaFixa }; n Declarados usando a sintaxe:
struct Transacao {
long data; attribute tipo ident ;
string descricao; n Caso a palavra-
palavra-chave readonly seja utilizada,
double valor;
}; o valor do atributo pode ser somente lido
sequence <Transacao> Transacoes; readonly attribute tipo ident ;
exception ContaInvalida { long conta; };
exception SaldoInsuficiente { double saldo; };
// ...
}; 75 76

CORBA CORBA
n Operações n Operações Oneway (assíncronas)
n Declaradas em IDL na forma: n Declaradas em IDL na forma:
tipo ident ( /* lista de parâmetros */ ) oneway void ident (/* lista de parâmetros */);
[ raises ( exceção [ , ... ] ) ];
n Uma operação oneway é assíncrona, ou seja,
n Parâmetros são separados por vírgulas e
o cliente não aguarda seu término.
in|out|inout} tipo ident
seguem a forma: {in|out|inout}
n Operações oneway não possuem retorno (o
n in:
in: parâmetro de entrada
n out:
tipo retornado é sempre void)
void) e as exceções
out: parâmetro de saída
possíveis são somente as padrão.
n inout:
inout: parâmetro de entrada e saída
n Apenas operações acessíveis remotamente
devem ser declaradas na IDL do servidor
77 78

13
CORBA CORBA
n Exemplo: Banco n O código pode ser implementado em
interface AutoAtendimento { qualquer linguagem mapeada para IDL
readonly attribute string boasVindas; public class AutoAtendimentoImpl Java
double saldo (in long conta) raises (ContaInvalida); extends AutoAtendimentoPOA {
void extrato (in long conta, out Transacoes t,
out double saldo) raises (ContaInvalida); public String boas_vindas() {
return “Bem-vindo ao Banco”;
void transferencia (in long origem, in long destino, }
in double v) raises (ContaInvalida, SaldoInsuficiente); ...
void investimento (in long c, in Aplicacao aplic, };
in double v) raises (ContaInvalida, SaldoInsuficiente); class auto_atendimentoImpl: C++
}; auto_atendimentoPOA { ... };
interface CaixaEletronico : AutoAtendimento {
char* banco_auto_atendimentoImpl::boas_vindas()
void saque (in long conta, in double valor) throws (CORBA::SystemException) {
raises (ContaInvalida, SaldoInsuficiente); return CORBA::string_dup(“Bem-vindo ao Banco”);
}; 79 } 80

CORBA CORBA
Tipo IDL Equivalente em Java
n Mapeamento IDL para Java boolean boolean
char char
n Definecomo são representados em Java os wchar char
elementos definidos em IDL short short
long int
n Regras de Mapeamento long long long
n Módulos são mapeados em packages Java unsigned short short
unsigned long int
n Interfaces,Exceções e Arrays e Strings são unsigned long long long
idênticos em Java float float
double double
n Sequências são mapeadas como Arrays
long double (não disponível)
n Constantes se tornam atributos estáticos octet byte
any CORBA.Any
CORBA.Any
n Estruturas de dados, Unions e Enums são
fixed Math.
Math.BigDecimal
mapeadas como classes Java 81 Object CORBA.Object
CORBA.Object 82

CORBA ORBA
n Mapeamento de Atributos IDL para Java n Implementação do Servidor
nÉ criado um método com o nome do atributo nO servidor deve iniciar o ORB e o POA, e
n Se o atributo não for readonly,
readonly, um método de disponibilizar sua referência para os clientes
mesmo nome permite modificar o seu valor n Referências podem ser disponibilizadas

n Mapeamento de Operações IDL para Java através do serviço de nomes, impressas na


tela ou escritas em um arquivo acessado pelos
n São criados métodos na interface
clientes usando o sistema de arquivos
correspondente, com os mesmos parâmetros
distribuído, um servidor HTTP ou FTP
e exceções
n Feito isso, o servidor deve ficar ouvindo
n Contexto inserido no final da lista de
requisições e as executando
parâmetros
83 84

14
CORBA CORBA
n Exemplo: Implementação do Banco n Exemplo: Servidor do Banco
package Banco; package Banco;
import org.omg.CORBA.*; import org.omg.CORBA.*;
import org.omg.CosNaming.*;
public class AutoAtendimentoImpl import org.omg.PortableServer.*;
extends AutoAtendimentoPOA { public class Servidor {
public String boasVindas () { public static void main(String args[]) {
return "Bem-vindo ao banco "+ NomeBanco.value; try{
} // Inicializa o ORB
ORB orb = ORB.init(args, null);
public Valor saldo (long conta) throws ContaInvalida { // Instancia o servidor
return BancoDB.getConta(conta).getSaldo(); AutoAtendimentoImpl aa= new AutoAtendimentoImpl();
} // Localiza e ativa o POA
// demais métodos... POA rootpoa = POAHelper.narrow( orb.
} resolve_initial_references("RootPOA"));
85 rootpoa.the_POAManager().activate(); 86

CORBA CORBA
n Exemplo: Servidor do Banco (cont.) n Implementação do Cliente
// Gera a referência remota do servidor n Um cliente deve sempre iniciar o ORB e obter
AutoAtendimento ref = AutoAtendimentoHelper.
narrow(rootpoa.servant_to_reference(aa)); uma referência para o objeto servidor
// Obtém a referência do servidor de nomes n Referências podem ser obtidas através do
NamingContextExt ns = NamingContextExtHelper.
narrow(orb.resolve_initial_references("NameService")); serviço de nomes, da linha de comando ou
// Registra o servidor lendo um arquivo que contenha a referência
ns.rebind(ns.to_name("Banco"), ref);
n De posse da referência, o cliente pode chamar
// Aguarda chamadas dos clientes
orb.run(); os métodos implementados pelo servidor
} catch (Exception e) { e.printStackTrace(); }
}
}
87 88

CORBA CORBA
n Implementação do Cliente n Implementação do Cliente (cont.)
import Banco.*; // Imprime mensagem de boas-vindas
import org.omg.CORBA.*; System.out.println(server.boasVindas());
import org.omg.CosNaming.*; // Obtém o numero da conta
public class Cliente { System.out.print("Entre o número da sua conta: ");
public static void main(String args[]) { String conta = new java.io.BufferedReader(new
try { java.io.InputStreamReader(System.in)).readLine();
// Inicializa o ORB // Imprime o saldo atual
ORB orb = ORB.init(args, null); System.out.println("Saldo da conta: R$"
// Obtém a referência do serviço de nomes + server.saldo(Integer.parseInt(conta)));
NamingContextExt ns = NamingContextExtHelper. } catch (ContaInvalida e) {
narrow(orb.resolve_initial_references("NameService")); System.out.println("Conta " + e.conta + " não existe.");
// Obtém a referência do servidor do banco } catch (Exception e) { e.printStackTrace(); }
AutoAtendimento server = auto_atendimentoHelper. }
narrow(ns.resolve_str("Banco")); 89
} 90

15