ANHANGUERA – 2016.1
PROGRAMAÇÃO CONCORRENTE
AULA 05 – COMUNICAÇÃO ENTRE PROCESSOS
Prof. Thomás da Costa
thomascosta@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 Processos
O 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 Processos
Tipos 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 Compartilhados
Detalhes:
• 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 Compartilhados
Detalhes:
• 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
Sockets
Detalhes:
• 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
Sockets
Detalhes:
• 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
Sockets
Detalhes:
• 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
Sinais
Detalhes:
• 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() {
@Override
public 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

Programação Concorrente - Aula 05

  • 1.
    ANHANGUERA – 2016.1 PROGRAMAÇÃOCONCORRENTE AULA 05 – COMUNICAÇÃO ENTRE PROCESSOS Prof. Thomás da Costa thomascosta@aedu.com
  • 2.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa COMUNICAÇÃO ENTRE PROCESSOS COMUNICAÇÃO ENTRE PROCESSOS
  • 3.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa COMUNICAÇÃO ENTRE PROCESSOS Comunicação Entre Processos O 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.
  • 4.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa COMUNICAÇÃO ENTRE PROCESSOS Comunicação Entre Processos Tipos de comunicação que vamos estudar: • Arquivos compartilhados utilizando Serialização de objetos em Java. • Comunicação Socket via TCP/IP.
  • 5.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa COMUNICAÇÃO ENTRE PROCESSOS Arquivos Compartilhados Detalhes: • 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.
  • 6.
    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; } }
  • 7.
    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) {} } } }
  • 8.
    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) {} } } }
  • 9.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa COMUNICAÇÃO ENTRE PROCESSOS Arquivos Compartilhados Detalhes: • 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.
  • 10.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa COMUNICAÇÃO ENTRE PROCESSOS Sockets Detalhes: • 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.
  • 11.
    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) {} } } }
  • 12.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa COMUNICAÇÃO ENTRE PROCESSOS Sockets Detalhes: • 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.
  • 13.
    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; } }
  • 14.
    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) {} } } }
  • 15.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa COMUNICAÇÃO ENTRE PROCESSOS Sockets Detalhes: • 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.
  • 16.
    PROGRAMAÇÃO CONCORRENTE –Prof. Thomás da Costa COMUNICAÇÃO ENTRE PROCESSOS Sinais Detalhes: • 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.
  • 17.
    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() { @Override public void run() { System.out.println("Terminando o programa"); } }); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }
  • 18.
    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
  • 19.