Você está na página 1de 29

Unidade 5

Comunicao entre Processos


Pipes Sockets Java RMI

Comunicao entre Processos


Processos e threads interagem para trabalhar conjuntamente em um sistema
Trocam dados / mensagens Utilizam os servios de comunicao fornecidos servi comunica pela mquina e pelo S.O. m Seguem protocolos de comunicao para que comunica possam entender uns aos outros

Comunicao entre Processos


Protocolos
Estabelecem caminhos virtuais de comunicao entre processos / threads comunica Duas entidades precisam usar os mesmos protocolos para trocar informaes informa

Protocolo Meio de Transmisso


3

Comunicao entre Processos


Protocolos
Com licena Pois no Que horas so? So 8 horas. Obrigado! De nada. Pede conexo Aceita conexo Envia mensagem Confirma recepo Fecha conexo Libera conexo

tempo
4

Comunicao entre Processos


Servios de comunicao
Servio sem Conexo: cada unidade de dados Servi Conexo: enviada independentemente das demais

Servio com Conexo: dados so enviados Servi Conexo: atravs de um canal de comunicao atrav comunica
Canal de Comunicao
5

Comunicao entre Processos


Caractersticas dos servios de comunicao entre processos/threads:
Abrangncia: local ou remota Participantes: 1 1, 1 N ou M N Tamanho das mensagens: fixo ou varivel; vari limitado ou no Sincronismo: comunicao sncrona, comunica s assncrona ou semi-sncrona ass semi-

Comunicao entre Processos


APIs de comunicao
Permitem que aplicaes troquem dados aplica Fornecem primitivas de comunicao que comunica podem ser chamadas a partir do cdigo Provem acesso aos servios de comunicao, servi comunica o, que podem assim ser usados pelas aplicaes aplica
Programa

API S.O.
7

Comunicao entre Processos


APIs de Comunicao de Sist. Operacionais
Mecanismos fornecidos pelos S.O.s permitem S.O. enviar mensagens (trechos de memria) mem de um processo a outro Alguns S.O.s permitem S.O. que sejam criadas reas de memria mem compartilhadas entre dois ou mais processos
P1 P2

P1

memria

P2
88

Comunicao entre Processos


Exemplos de APIs de comunicao:
Pipes: canais de comunicao locais comunica Sockets: portas de comunicao locais ou de comunica rede (verso segura: SSL) segura: Suportes de RPC (Remote Procedure Call): permitem chamar procedimentos/mtodos procedimentos/m remotamente (ex.: RMI, CORBA, COM, ) Canais de eventos: permitem notificar threads eventos: e processos dos eventos ocorridos no sistema (Ex.: JMS, CORBA Notification Service, )
9

Comunicao entre Processos


Mecanismos de IPC nativos do UNIX
Pipes Sockets (comunicao local ou remota) (comunica

Mecanismos de IPC nativos do Windows


Pipes e Mailslots
WinSock (comunicao local ou remota) (comunica Microsoft RPC (comunicao local ou remota) (comunica Memria compartilhada: File Mapping e Mem Dynamic Data Exchange (DDE) Object Linking and Embedding (OLE)
10 10

Comunicao entre Processos


RPC Chamada Remota de Procedimento
Segue o modelo Cliente/Servidor Muito usado na interao entre objetos intera Objeto servidor possui interface com mtodos m que podem ser chamados remotamente Objetos clientes usam servios de servidores servi
Cliente
x = Servidor.Soma(y,z);

Servidor
Soma(int y, int z) { return(y+z); }
11

Comunicao entre Processos


RPC Caractersticas
Em geral as requisies so ponto-a-ponto e requisi pontosncronas Dados so tipados Parmetros da requisio requisi Retorno do procedimento/mtodo procedimento/m Excees Exce Um objeto pode ser cliente e servidor em momentos diferentes
12

Comunicao entre Processos


Notificao de Eventos
Eventos ocorridos so difundidos por produtores e entregues a consumidores Canal de eventos permite o desacoplamento
produtor e consumidor no precisam se conhecer

Canal de Eventos
Produtores de Eventos Consumidores de Eventos
13

Comunicao entre Processos


Notificao de Eventos Caractersticas
Envio de eventos completamente assncrono ass Produtor no precisa aguardar fim do envio Evento armazenado no canal de eventos Comunicao pode ser feita atravs de UDP Comunica atrav multicast ou fazendo mltiplos envios unicast com TCP, UDP ou com um suporte de RPC Os eventos podem ter tamanho fixo ou varivel, limitado ou ilimitado vari vel, Eventos podem ser tipados ou no
14

Pipes
Pipes = canais de comunicao
Duas threads podem trocar dados por um pipe comunicao de 1 para 1 comunica Threads devem rodar na mesma mquina m virtual comunicao local comunica

Thread 1
PIPE

Thread 2

15

Pipes
Disponveis em Java atravs das classes PipedInputStream e PipedOutputStream Principais mtodos:
Criao dos Pipes: Cria Pipes: is = new PipedInputStream(); PipedInputStream(); os = new PipedOutputStream(is); PipedOutputStream(is); Envio e recepo de bytes / arrays de bytes: recep is.read(dado) is.read(dado) os.write(dado); os.flush(); os.write(dado); Exceo: java.io.IOException Exce java. io.
16

Pipes
Uso de Pipes com fluxos (streams) de dados
Criao do fluxo: Cria in = new java.io.DataInputStream(is); java. io. DataInputStream(is); out = new java.io.DataOutputStream(os); java. io. DataOutputStream(os); Envio e recepo de dados: recep <tipo> var = in.read<tipo>(); in.read< out.write<tipo>(var); out.write< onde <tipo> = Int, Long, Float, Double, etc. Long, Float, Double,

17

Pipes
public class Producer extends Thread { private DataOutputStream out; private Random rand = new Random(); public Producer(PipedOutputStream os) { out = new DataOutputStream(os); } public void run() { while (true) try { int num = rand.nextInt(1000); out.writeInt(num); out.flush(); sleep(rand.nextInt(1000)); } catch(Exception e) { e.printStackTrace(); } } }

18

Pipes
public class Consumer extends Thread { private DataInputStream in; public Consumer(PipedInputStream is) { in = new DataInputStream(is); } public void run() { while(true) try { int num = in.readInt(); System.out.println("Nmero recebido: " + num); } catch(IOException e) { e.printStackTrace(); } } }

19

Pipes
public class PipeTest { public static void main(String args[]) { try { PipedOutputStream out = new PipedOutputStream(); PipedInputStream in = new PipedInputStream(out); Producer prod = new Producer(out); Consumer cons = new Consumer(in); prod.start(); cons.start(); } catch (IOException e) { e.printStackTrace(); } } }
20

Pipes
Uso de Pipes com fluxos de objetos
Criao do fluxo: Cria in = new java.io.ObjectInputStream(is); java. io. ObjectInputStream(is); out = new java.io.ObjectOutputStream(os); java. io. ObjectOutputStream(os); Envio e recepo de objetos: recep <classe> obj = (<classe>) in.readObject(); in.readObject(); out.writeObject(obj); out.writeObject(obj); onde <classe> = classe do objeto lido/enviado Envio e recepo de Strings: recep Strings: String str = in.readUTF(); in.readUTF(); out.writeUTF(str); out.writeUTF(str);
21

Sockets
Socket
Abstrao que representa uma porta de comuAbstra comunicao bidirecional associada a um processo nica

Principais Tipos de Socket


Socket Datagrama: envia/recebe datagramas Datagrama: sem criar conexo; usa protocolo UDP conexo; Socket Multicast: recebe as mensagens endereadas a um grupo; usa UDP multicast endere grupo; Socket Stream: estabelece uma conexo com outro socket; usa protocolo TCP

22

Sockets
Operaes com Sockets Datagrama
Criar um socket datagrama: datagrama:
DatagramSocket s = new DatagramSocket(porta); DatagramSocket(porta);

Criar pacotes de dados para envio: envio:


DatagramPacket pack = new DatagramPacket(msg, DatagramPacket(msg, tamanho, destino, porta); tamanho, destino, porta);

Enviar dados: s.send(pack); s.send(pack); Criar pacotes de dados para recepo: recep o:
DatagramPacket pack = new DatagramPacket(msg,tam); DatagramPacket(msg,tam); Receber dados: s.receive(pack); s.receive(pack);

Ler dados do pacote: pack.getData() pacote: pack.getData()


23

Sockets
Sockets Datagrama Envio
try { DatagramSocket socket = new DatagramSocket(); InetAddress destino = InetAddress.getByName( "127.0.0.1"); String mensagem = "Hello"; byte[] dados = mensagem.getBytes(); int porta = 1234; DatagramPacket pacote = new DatagramPacket( dados, dados.length, destino, porta); socket.send(pacote); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) {e.printStackTrace(); }

24

Sockets
Sockets Datagrama Recepo
try { int porta = 1234; DatagramSocket socket = new DatagramSocket(porta); byte[] dados = new byte[100]; DatagramPacket pacote = new DatagramPacket( dados, dados.length); socket.receive(pacote); String mensagem = new String(pacote.getData(), 0, pacote.getLength() ); System.out.println("Mensagem: " + mensagem); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) {e.printStackTrace(); }
25

Sockets
Sockets Multicast
Permitem o envio simultneo de datagramas a grupos de destinatrios destinat Grupos multicast so identificados por endereos IP de 224.0.0.0 a 239.255.255.255 endere
Grupo Multicast

Emissores
26

Sockets
Sockets Multicast
Vrios emissores podem mandar mensagens para o grupo (ou seja, mensagens vo de seja, X emissores Y receptores) receptores) Emissor no precisa fazer parte do grupo para enviar mensagens ao grupo, e nem precisa grupo, saber quem so os seus membros; basta membros; conhecer o endereo IP do grupo endere O receptor entra em um grupo (se torna um membro do grupo) e passa a receber as mensagens destinadas ao grupo
27

Sockets
Sockets Multicast Envio
try { DatagramSocket socket = new DatagramSocket(); InetAddress grupo = InetAddress.getByName( "230.1.2.3"); String mensagem = "Hello"; byte[] dados = mensagem.getBytes(); int porta = 1234; DatagramPacket pacote = new DatagramPacket( dados, dados.length, grupo, porta); socket.send(pacote); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
28

Sockets
Sockets Multicast Recepo
try { int porta = 1234; MulticastSocket msocket = new MulticastSocket(porta); InetAddress grupo = InetAddress.getByName( "230.1.2.3"); msocket.joinGroup(grupo); byte[] dados = new byte[100]; DatagramPacket pacote = new DatagramPacket( dados, dados.length); msocket.receive(pacote); System.out.println("Mensagem: " + new String(pacote.getData(), 0, pacote.getLength())); } catch (Exception e) {e.printStackTrace(); }

29

Sockets
Sockets Stream
Estabelecem canais de comunicao entre comunica aplicaes, permitindo troca de dados pela rede aplicaes, Adotam o paradigma cliente-servidor clienteCliente: pede para conectar ao servidor Cliente: Servidor: aguarda conexes dos clientes Servidor:
Cliente Servidor

30

Sockets
Operaes com Sockets Stream no Servidor
Criar um socket servidor: servidor:
ServerSocket s = new ServerSocket(porta, maxClientes); ServerSocket(porta, maxClientes); Aguardar conexo: Socket c = s.accept(); conexo: s.accept();

Obter nome do host conectado: conectado:


String host = c.getInetAddress().getHostName(); c.getInetAddress().getHostName();

Criar fluxos de comunicao: comunica o:


ObjectInputStream in = new ObjectInputStream(c.getInputStream()); ObjectInputStream(c.getInputStream()); ObjectOutputStream out = new ObjectOutputStream(c.getOutputStream()); ObjectOutputStream(c.getOutputStream());

Fechar conexo: in.close(); out.close(); c.close(); conexo: in.close(); out.close(); c.close();


31

Sockets
Operaes com Sockets Stream no Cliente
Criar um socket cliente: cliente:
Socket c = new Socket( InetAddress. InetAddress. getByName("servidor.com "), porta );

Criar fluxo, enviar e receber dados, e fechar: fluxo, fechar: idem ao servidor

Excees geradas
SocketException UnknownHostException IOException
32

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

Sockets
Sockets Stream Cliente
try { Socket socket = new Socket(InetAddress.getByName( "127.0.0.1"), 1234); ObjectOutputStream output = new ObjectOutputStream( socket.getOutputStream()); output.flush(); ObjectInputStream input = new ObjectInputStream( socket.getInputStream() ); String mensagem = "Ol Servidor"; output.writeObject(mensagem); output.flush(); String resposta = (String) input.readObject(); } catch (Exception e) { e.printStackTrace(); } 34

Java RMI
Java RMI (Remote Method Invocation)
Fornece um suporte simples para RPC/RMI Permite que um objeto Java chame mtodos m de outro objeto Java rodando em outra JVM Soluo especfica para a plataforma Java Solu espec

Cliente

Internet Internet

Servidor

JVM

JVM
35

Java RMI
Arquitetura RMI
Stub e Skeleton
Camada de referncia remota Camada de transporte
JVM
Cliente Servidor

JVM

Stub

Skeleton

Camada de Referncia Remota Camada de Transporte


36

Java RMI
Stub
Representa o servidor para o cliente Efetua serializao e envio dos parmetros serializa Recebe a resposta do servidor, desserializa e servidor, entrega ao cliente

Skeleton
Recebe a chamada e desserializa os parmetros enviados pelo cliente Faz a chamada no servidor e retorna o resultado ao cliente

37

Java RMI
Camada de Referncia Remota
Responsvel pela localizao dos objetos nas espons localiza mquinas da rede Permite que referncias para um objeto servidor remoto sejam usadas pelos clientes para chamar mtodos

Camada de Transporte
Cria e gerencia conexes de rede entre objetos remotos Elimina a necessidade do cdigo do cliente ou c do servidor interagirem com o suporte de rede
38

Java RMI
Dinmica da Chamada RMI
O servidor, ao iniciar, se registra no servio de servidor, iniciar, servi nomes (RMI Registry ) O cliente obtm uma referncia para o objeto obt servidor no servio de nomes e cria a stub servi O cliente chama o mtodo na stub fazendo uma chamada local A stub serializa os parmetros e transmite a chamada pela rede para o skeleton do servidor

39

Java RMI
Dinmica da Chamada RMI (cont.)
O skeleton do servidor recebe a chamada pela rede, desserializa os parmetros e faz a rede, chamada do mtodo no objeto servidor O objeto servidor executa o mtodo e retorna um valor para o skeleton, que o serializa e o envia pela rede stub do cliente A stub recebe o valor do retorno serializado, o serializado, desserializa e por fim o repassa ao cliente
40

Java RMI
Serializao de Dados
preciso serializar e deserializar os parmetros da chamada e valores de retorno para transmiti-los atravs da rede transmitiatrav Utiliza o sistema de serializao de objetos da serializa mquina virtual Tipos predefinidos da linguagem Objetos serializveis: implementam serializ veis: interface java.io.serializable
41

Implementao de RMI
Vrios objetos esto envolvidos com o suporte a RMI.
Stub B Cliente Objeto A Request Reply Servidor Skeleton & Dispatcher da Classe B Objeto remoto B

Mdulo referncia remota

Mdulo comunicao

Mdulo comunicao

Mdulo referncia remota

42

Exemplo: Cliente/Servidor RMI


Receita de bolo:
Definir uma interface remota que descreve como o cliente e o servidor se comunicam um com o outro; Definir o aplicativo servidor que implementa a interface remota. Por conveno, a classe de implementao de servidor tem o mesmo nome que a interface remota e termina com Impl; Definir o aplicativo cliente que utiliza uma referncia de interface remota para interagir com a implementao de servidor da interface. Isto , um objeto da classe que implementa a interface remota; Compilar e executar o servidor e o cliente.
43

Exemplo: Cliente/Servidor RMI


Escreve interface Escreve cliente Escreve servidor

Cliente.java

ServidorImpl .java rmic

Servidor.java

javac

javac

Cliente.class ServidorImpl_ Stub.class java Cliente Cliente

ServidorImpl_ Stub.class

Servidor.class

rmiregistry java Servidor Servidor


44

Exemplo: Cliente/Servidor RMI


Desenvolvimento de Aplicaes com RMI
Devemos definir a interface do servidor A interface do servidor deve estender java.rmi.Remote ou uma classe dela java. rmi. derivada (ex.: UnicastRemoteObject) UnicastRemoteObject) Todos os mtodos da interface devem m prever a exceo java.rmi.RemoteException exce java. rmi. O Servidor ir implementar esta interface ir Stubs e skeletons so gerados pelo compilador RMI (rmic) com base na interface do servidor (rmic)
45

Exemplo: Cliente/Servidor RMI


Passo 1: definindo a interface remota
Descrever os mtodos remotos que sero oferecidos ao cliente (RMIServidorInt.java);
import java.rmi.*; import java.rmi.*; public interface RMIServidorInt extends Remote { public interface RMIServidorInt extends Remote { public void mensagem(String str) public void mensagem(String str) throws RemoteException; throws RemoteException; } }

Passo 2: Implementar a interface do servidor declarada no passo 1.


46

RMIServidorImpl.java
import java.rmi.*; import java.rmi.server.*; public class RMIServidorImpl extends UnicastRemoteObject implements RMIServidorInt { public RMIServidorImpl() throws RemoteException { super(); } public void mensagem(String str) { System.out.println(str); } }
47

RMIServer.java
import java.rmi.Naming; public class Servidor { public static void main(String args[]) throws Exception { System.err.println("Initializing server: please wait."); // cria um objeto RMIServidorImpl temp = new RMIServidorImpl(); // bind o objeto RMIServidorImpl ao rmiregistry String serverObjectName = "//localhost/NomedoObjeto"; Naming.rebind(serverObjectName, temp); System.out.println("O Servidor est pronto !"); } }
48

Exemplo: Cliente/Servidor RMI


Passo 2 (continuao): gerando o stub (cdigo da comunicao). c:\teste\javac RMIServidorImpl.java isso vai gerar RMIServidorImpl.class c:\teste\javac Servidor.java isso vai gerar Servidor.class c:\teste\rmic v1.2 RMIServidorImpl isso vai gerar RMIServidorImpl_Stub.class Ateno: uma cpia desse arquivo e a interface devem ser fornecidos ao cliente. 49

Exemplo: Cliente/Servidor RMI


Passo 3: Implementar o cliente de acordo com a interface do RMIServidorInt.
import java.rmi.*; public class Cliente { public static void main(String[] args) { try { RMIServidorInt NomedoObjeto");

c =(RMIServidorInt)Naming.lookup("//localhost/

String m = "Hello World !";

c.mensagem(m);
} catch(Exception e) { System.out.println(e); // ou e.printStackTrace(); } }}
50

Exemplo: Cliente/Servidor RMI


Passo 4: compilar e executar o servidor e o cliente. - compilar o cliente: c:\teste\javac Cliente.java - ativar o servidor de nomes (rmiregistry): c:\teste\rmiregistry Ateno: tem que est no mesmo diretorio onde est RMIServidorImpl_Stub.class - executando o servidor e cliente: c:\teste\java Servidor c:\teste\java Cliente Possveis erros: classpath falta c:\teste
51

Exemplo 2: Java RMI


Java RMI Interface do Servidor
implementada pelo servidor chamada pelo cliente Estende a interface java.rmi.Remote java. rmi. Todos os mtodos devem prever a exceo m exce java.rmi.RemoteException java. rmi.
public interface HelloWorld extends java.rmi.Remote { public String hello() throws java.rmi.RemoteException; }
52

Java RMI
Java RMI Implementao do Servidor
import java.rmi.*; import java.rmi.server.*; public class HelloServer extends UnicastRemoteObject implements HelloWorld { public HelloServer() throws RemoteException {super();} public String hello() throws RemoteException { return "Hello!!!"; } public static void main(String[] args) { try { HelloServer servidor = new HelloServer(); Naming.rebind("//localhost/HelloWorld", servidor); } catch (Exception e) { e.printStackTrace(); } } }

53

Java RMI
Java RMI Implementao do Cliente
public class HelloClient { public static void main(String[] args) { try { HelloWorld servidor = (HelloWorld) java.rmi.Naming.lookup("//localhost/HelloWorld"); String msg = servidor.hello(); System.out.println("Mensagem do Servidor: "+msg); } catch (Exception e) { e.printStackTrace(); } } }

54

RMIRegitry
void rebind (String name, Remote obj) //Este mtodo usado por um servidor registrar o identificador de um objeto remoto //pelo nome void bind (String name, Remote obj) //Este mtodo pode de maneira alternativa ser usado por um servidor registrar o //identificador de um objeto remoto pelo nome. //Se o nome j ligado a uma referncia remota uma exceo levantada. void unbind (String name, Remote obj) //Este mtodo remove um binding. Remote lookup(String name) //Este mtodo usado por um cliente para obter uma referncia de objeto remoto. String[] list() //Este mtodo retorna um array de Strings contendo nomes ligados no registro. Interface do RMIRegistry
55

Java RMI
RMI/IIOP
A partir do Java 2.0, o RMI passou a permitir a utilizao do protocolo IIOP (Internet Interutiliza InterORB Protocol) do CORBA IIOP tambm usa TCP/IP, mas converte os tamb dados para um formato padro (seralizao ou seraliza marshalling) diferente do Java RMI Com RMI/IIOP, objetos Java podem se comunicar com objetos CORBA, que podem ser escritos em outras linguagens
56

Exerccio 1
import java.rmi.*; import java.rmi.server.*; import java.net.*; public interface Calculator extends Remote { public long add(long a, long b) throws RemoteException; public long sub(long a, long b) throws RemoteException; public long mul(long a, long b) throws RemoteException; public long div(long a, long b) throws RemoteException; }
57

Exerccio 2
import java.rmi.*; import java.rmi.server.*; import java.net.*; public interface Banco extends Remote { public String add(Conta correntista, short val) throws RemoteException; public String rem(Conta correntista, short val) throws RemoteException; public short saldo(Conta correntista) throws RemoteException; public Conta cadastrar(String nome, short CPF) throws RemoteException; }
58