Beruflich Dokumente
Kultur Dokumente
tempo
4
Servio com Conexo: dados so enviados Servi Conexo: atravs de um canal de comunicao atrav comunica
Canal de Comunicao
5
API S.O.
7
P1
memria
P2
88
Servidor
Soma(int y, int z) { return(y+z); }
11
Canal de Eventos
Produtores de Eventos Consumidores de Eventos
13
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
22
Sockets
Operaes com Sockets Datagrama
Criar um socket datagrama: datagrama:
DatagramSocket s = new DatagramSocket(porta); DatagramSocket(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);
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();
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
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 comunicao
Mdulo comunicao
42
Cliente.java
Servidor.java
javac
javac
ServidorImpl_ Stub.class
Servidor.class
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
c =(RMIServidorInt)Naming.lookup("//localhost/
c.mensagem(m);
} catch(Exception e) { System.out.println(e); // ou e.printStackTrace(); } }}
50
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