19
ANHANGUERA – 2016.1 PROGRAMAÇÃO CONCORRENTE AULA 05 – COMUNICAÇÃO ENTRE PROCESSOS Prof. Thomás da Costa [email protected]

Programação Concorrente - Aula 05

Embed Size (px)

Citation preview

Page 1: Programação Concorrente - Aula 05

ANHANGUERA – 2016.1

PROGRAMAÇÃO CONCORRENTEAULA 05 – COMUNICAÇÃO ENTRE PROCESSOS

Prof. Thomás da [email protected]

Page 2: Programação Concorrente - Aula 05

PROGRAMAÇÃO CONCORRENTE – Prof. Thomás da Costa

COMUNICAÇÃO ENTRE PROCESSOS

COMUNICAÇÃO ENTRE PROCESSOS

Page 3: Programação Concorrente - Aula 05

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.

Page 4: Programação Concorrente - Aula 05

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.

Page 5: Programação Concorrente - Aula 05

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.

Page 6: Programação Concorrente - Aula 05

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;}

 }

Page 7: Programação Concorrente - Aula 05

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) {}}

}}

Page 8: Programação Concorrente - Aula 05

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) {}}

}}

Page 9: Programação Concorrente - Aula 05

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.

Page 10: Programação Concorrente - Aula 05

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.

Page 11: Programação Concorrente - Aula 05

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) {}

}}

}

Page 12: Programação Concorrente - Aula 05

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.

Page 13: Programação Concorrente - Aula 05

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;}

}

Page 14: Programação Concorrente - Aula 05

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) {}}

}}

Page 15: Programação Concorrente - Aula 05

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.

Page 16: Programação Concorrente - Aula 05

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.

Page 17: Programação Concorrente - Aula 05

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();

}}

}

Page 18: Programação Concorrente - Aula 05

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

Page 19: Programação Concorrente - Aula 05

Obrigado !!!

ANHANGUERA – 2016.1