programação concorrente - aula 05
Post on 12-Apr-2017
240 Views
Preview:
TRANSCRIPT
ANHANGUERA – 2016.1
PROGRAMAÇÃO CONCORRENTEAULA 05 – COMUNICAÇÃO ENTRE PROCESSOS
Prof. Thomás da Costathomascosta@aedu.com
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
COMUNICAÇÃO ENTRE PROCESSOS
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Comunicação Entre ProcessosO que é?:É a troca de informações ou mensagens entre programas, localizados no mesmo computador ou em computadores diferentes. Essa comunicação pode acontecer também em redes diferentes.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Comunicação Entre ProcessosTipos de comunicação que vamos estudar:• Arquivos compartilhados utilizando Serialização de objetos em Java.• Comunicação Socket via TCP/IP.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Arquivos CompartilhadosDetalhes:• Um arquivo fica localizado em um diretório.• Programas podem acessar este arquivo para compartilhar informações.• Vamos utilizar o conceito de serialização de classes em Java.• Neste processo, o arquivo contém os bytecodes de uma classe.• Para que ocorra a serialização, uma classe deve implementar a interface
Serializable.• A classe que implementa a interface Serializable é um POJO que possui
somente atributos com getter e setters.• Não vamos nos preocupar com acessos simultâneos no arquivo.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.Serializable; public class Pessoa implements Serializable {
private static final long serialVersionUID = -8617059067424820303L;
private String nome;private int idade;private double altura;private double peso;
public Pessoa() {}
public String getNome() {
return nome;}
public void setNome(String nome) {
this.nome = nome;}
public int getIdade() {
return idade;}
public void setIdade(int idade) {
this.idade = idade;}
public double getAltura() {return altura;
}
public void setAltura(double altura) {
this.altura = altura;}
public double getPeso() {
return peso;}
public void setPeso(double peso) {
this.peso = peso;}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.FileOutputStream;import java.io.ObjectOutputStream; public class SerializandoObjeto {
public static void main(String[] args) {Pessoa pessoa = new Pessoa();FileOutputStream fileOutputStream = null;ObjectOutputStream objectOutputStream = null;
try {pessoa.setAltura(1.75);pessoa.setIdade(31);pessoa.setNome("Bruce Wayne");pessoa.setPeso(85.45);
fileOutputStream = new FileOutputStream("/tmp/pessoa.obj");objectOutputStream = new ObjectOutputStream(fileOutputStream);objectOutputStream.writeObject(pessoa);
} catch (Exception e) {e.printStackTrace();
} finally {try {
fileOutputStream.close();objectOutputStream.close();
} catch (Exception e) {}}
}}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.FileInputStream;import java.io.ObjectInputStream; public class DeserializandoObjeto {
public static void main(String[] args) {Pessoa pessoa = null;FileInputStream fileInputStream = null;ObjectInputStream objectInputStream = null;
try {fileInputStream = new FileInputStream("/tmp/pessoa.obj");objectInputStream = new ObjectInputStream(fileInputStream);
pessoa = (Pessoa) objectInputStream.readObject();
System.out.println(pessoa.getAltura());System.out.println(pessoa.getIdade());System.out.println(pessoa.getNome());System.out.println(pessoa.getPeso());
} catch (Exception e) {e.printStackTrace();
} finally {try {
fileInputStream.close();objectInputStream.close();
} catch (Exception e) {}}
}}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
Arquivos CompartilhadosDetalhes:• Utilizamos a classe FileOutputStream para criar um arquivo em um
diretório.• A classe ObjectOutputStream grava o objeto Pessoa no arquivo
especificado.• Este processo acontece a Serialização do objeto.• Para Deserializar o objeto, utilizamos o FileInputStream para efetuar a
leitura do arquivo e ObjectInputStream para criar o objeto Pessoa.• É necessário efetuar um cast para o tipo especificado.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
SocketsDetalhes:• Comunicação entre processos localizados normalmente em computadores
diferentes.• Utilizamos a rede para o envio de informações entre um processo e outro.• Esta comunicação acontece via TCP/IP.• É necessário conhecer o endereço e a porta do processo destino para que
ocorra a comunicação.• Existe uma padronização feita pelo cliente e servidor para que ocorra a
troca de informações.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.IOException;import java.net.ServerSocket;import java.net.Socket; public class Servidor {
public static void main(String[] args) {ServerSocket servidor = null;try {
System.out.println("[SERVER] - Iniciando Servidor na porta 1234...");
servidor = new ServerSocket(1234);System.out.println("[SERVER] - Servidor Iniciado");
while (true) {System.out.println("[SERVER] - Aguardando conexão.");Socket cliente = servidor.accept();System.out.println("[SERVER] - Conexão Recebida de " +
cliente.getInetAddress().getHostAddress());ProcessamentoThread processThread = new
ProcessamentoThread();processThread.setSocket(cliente);Thread thread = new Thread(processThread);thread.start();System.out.println("[SERVER] - Thread de processamento em
execução.");}
} catch (IOException e) {e.printStackTrace();
} finally {try {
servidor.close();} catch (IOException e) {}
}}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
SocketsDetalhes:• Neste exemplo, estamos criando uma comunicação cliente-servidor.• Utilizamos a classe ServerSocket para criar um servidor que irá receber
conexões de seus clientes.• Este servidor é executado na porta 1234.• Para cada conexão, criamos uma Thread para paralelizar o processamento
das informações.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.IOException;import java.net.Socket;import java.util.Scanner; public class ProcessamentoThread implements Runnable {
private Socket cliente = null;
public void run() {System.out.println("[PROCESSO] - Executando processamento do cliente " +
cliente.getInetAddress().getHostAddress());Scanner scanner = null;try {
scanner = new Scanner(cliente.getInputStream());while (scanner.hasNextLine()) {
System.out.println("[PROCESSO] - Mensagem Recebida: " +
scanner.nextLine());}
} catch (IOException e) {e.printStackTrace();
} finally {scanner.close();
}}
public Socket getSocket() {
return cliente;}
public void setSocket(Socket socket) {
this.cliente = socket;}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; import java.io.IOException;import java.io.PrintStream;import java.net.Socket; import javax.swing.JOptionPane; public class Cliente {
public static void main(String[] args) {Socket servidor = null;try {
String mensagem = (String) JOptionPane.showInputDialog(null, "Escreva uma mensagem:",
"Mensagem do Cliente", JOptionPane.PLAIN_MESSAGE, null, null,
"escreva aqui");System.out.println("[CLIENT] - Conectando no servidor");servidor = new Socket("localhost", 1234);System.out.println("[CLIENT] - Conexão com sucesso !!!");
PrintStream printStream = new PrintStream(servidor.getOutputStream());
printStream.println(mensagem);
System.out.println("[CLIENT] - Mensagem enviada: " + mensagem);} catch (Exception e) {
e.printStackTrace();} finally {
try {servidor.close();
} catch (IOException e) {}}
}}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
SocketsDetalhes:• O cliente informa o endereço e a porta do servidor para efetuar a conexão.• Nosso cliente envia uma informação através de uma caixa de dialogo.• O servidor imprime a informação enviada pelo cliente.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
COMUNICAÇÃO ENTRE PROCESSOS
SinaisDetalhes:• São eventos disparados dentro de um sistema operacional para indicar
alguma ação dentro de um processo.• Efetua a comunicação desses eventos para um processo.• Os sinais são eventos assíncronos.• Um exemplo de sinal é quando uma aplicação é finalizada.
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
package edu.anhanguera.prc.aula05; public class ShutdownHook {
public static void main(String[] args) {Runtime.getRuntime().addShutdownHook(new
Thread() {@Overridepublic void run() {
System.out.println("Terminando o programa");
}});
try {Thread.sleep(5000);
} catch (InterruptedException e) {e.printStackTrace();
}}
}
PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa
Resumo• Comunicação entre processos é troca de informações entre programas.• Essa comunicação pode ser:
• Arquivo compartilhado.• Socket.
• Serialização é o processo de gravar as informações de uma classe em Java em um arquivo.
• Deserialização é o processo de recuperar informações de um arquivo e carrega-los em uma classe Java.
COMUNICAÇÃO ENTRE PROCESSOS
Obrigado !!!
ANHANGUERA – 2016.1
top related