O documento discute diferentes métodos de comunicação entre processos, incluindo:
1) Arquivos compartilhados usando serialização de objetos em Java;
2) Comunicação socket via TCP/IP;
3) Sinais que indicam eventos dentro de um processo operacional.
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) {}
}
}
}
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