Você está na página 1de 140

DESENVOLVIMENTO

DE APLICAES
DISTRIBUDAS

2015.2
PROF ANDERSON

APRESENTAO
Currculo Lattes: http://lattes.cnpq.br/1640275970796898
Email: asantos@unicarioca.edu.br

DESENVOLVIMENTO DE APLICAES DISTRIBUDAS

AVALIAO DE APRENDIZAGEM - CRITRIOS


AV1: Obrigatria, presencial, individual e sem consulta. Compe 100% da nota.
AV2: Prova presencial (tipo objetiva, discursiva ou mista) ou online (tipo objetiva) sob
a responsabilidade e elaborada pelo professor, seguindo princpios bsicos
definidos previamente.
APS: Obrigatria e compe 40% da AV2 ou da Segunda Chamada.
A

2 CHAMADA: Obrigatria, presencial, individual e sem consulta. Para os alunos


que no fizeram AV1 vale 10,0 pontos. Para os alunos que no fizeram AV2 vale
6,0 pontos.
AVF: Obrigatria, presencial, individual e sem consulta. Compe 100% da nota.

DESENVOLVIMENTO DE APLICAES DISTRIBUDAS

AVALIAO DE APRENDIZAGEM - CRITRIOS

Prova

Questes Objetivas

Questes Discursivas

Quantidade

Valor

Quantidade

Valor

AV1

AV2

0,5

1,5

2a Chamada
da AV1

2a Chamada
da AV2

0,5

1,5

AVF

DESENVOLVIMENTO DE APLICAES DISTRIBUDAS

CONDIES PARA APROVAO NA DISCIPLINA


Condies para aprovao:
- Frequncia mnima de 75% das aulas
- Nota mnima:
- SEM AVF: 7,0
- COM AVF: 6,0

DESENVOLVIMENTO DE APLICAES DISTRIBUDAS

CONDIES PARA APROVAO NA DISCIPLINA


Justificatica:
- Atestado mdico ou do trabalho.
- Dever conter o dia que o aluno esteve ausente.
- Colocar anotado no verso o nome completo, turma, disciplina e
unidade.
- O aluno que faltar a AV1 ou a AV2 dever entregar o atestado no
dia da prova de SEGUNDA CHAMADA, caso contrrio no poder
fazer a prova.

DESENVOLVIMENTO DE APLICAES DISTRIBUDAS

DATAS IMPORTANTES

23 SET: AV1
Matria: Unidades 1, 2 e 3.
11 NOV: AV2
Matria: Unidades 1, 2, 3 e 4.
25 NOV: Segunda Chamada
Matria: Unidades 1, 2, 3 e 4.
02 DEZ: AVF
Matria: Unidades 1, 2, 3 e 4.

DESENVOLVIMENTO DE APLICAES DISTRIBUDAS

CONTEDO PROGRAMTICO

UNIDADE 1 - INTRODUO
UNIDADE 2 - FUNDAMENTOS
UNIDADE 3 - SOCKET, RPC E RMI
UNIDADE 4 - WEB SERVICES

DESENVOLVIMENTO DE APLICAES DISTRIBUDAS

BIBLIOGRAFIA

DESENVOLVIMENTO DE APLICAES DISTRIBUDAS

ATIVIDADE SUPERVISIONADA
ENUNCIADO:
Implementar um programa em Java que permita a troca de arquivos entre dois
computadores.
Requisitos:
- Dois usurios: remetente e destinatrio;
- O remetente poder escolher o arquivo;
- Poder ser qualquer tipo de arquivo;
- O destinatrio poder se recusar a receber o arquivo;
- O remetente ser avisado:
- se o destinatrio no quiser receber o arquivo;
- se o destinatrio recebeu o arquivo;
- O arquivo a ser enviado dever estar criptografado com um algoritmo de
criptografia simtrica.
Prazo: 11 NOV
Grupo: 05 alunos

INTRODUO
I
-Histrico
-Conceitos Bsicos
-Ambiente de Programao

INTRODUO
Histrico
-ARPAnet - Creeper & Reaper-ran, dcada de 70
-Aproveitamento

de recursos ociosos:
-Processamento
-Armazenamento

Robert Thomas
Morris
"Im creeper..
catch me if you
can"

INTRODUO
Histrico

- Evoluo

dos processadores
- Lei de Moore: a cada 18 meses a quantidade de transistores iria dobrar

INTRODUO
Histrico

Anos 70 -> mainframe: computao centralizada


Anos 80 -> descentralizao, uso de redes locais criou Ilhas
computacionais nas instituies
Baixo nvel de utilizao: estaes de trabalho passam maior
tempo ociosas
Distribuio desproporcional de carga de trabalho: alguns
servidores passam ocupados a maior parte do tempo enquanto
outros no
Necessidade de alto poder de processamento atual e tende a
aumentar no futuro

INTRODUO
Conceitos Bsicos

Cluster x Grade Computacional

INTRODUO
Conceitos Bsicos

Cluster
Compreende dois ou mais computadores
ou sistemas (denominados ns) na qual
trabalham em conjunto para executar
aplicaes ou realizar outras tarefas, de tal
forma para que os usurios que os utilizam
tenham a impresso que somente um
nico sistema responde para eles.

INTRODUO
Conceitos Bsicos

Tipos de Cluster

Alta
Disponibilidade:
disponibilidade de servios e
recursos de forma ininterruptas
atravs do uso da redundncia
implcitas ao sistema;
- Balanceamento de carga:
distribui as requisies de
recursos entre as mquinas que
compem o cluster.

INTRODUO
Conceitos Bsicos

Algoritmos de Balanceamento
de Carga
- Least Connections: redireciona as
requisies para o servidor baseado no
menor nmero de requisies/conexes.
- Round Robin: sempre direcionar as
requisies para o prximo servidor
disponvel de uma forma circula
- Weighted Fair: dirige os pedidos para
os servidores baseados na carga de
requisies de cada um e na
capacidade de resposta dos mesmos

INTRODUO
Conceitos Bsicos

Beowulf Cluster
O cluster Beowulf foi idealizado pelos
seus desenvolvedores com o objetivo
de suprir a crescente e elevada
capacidade de processamento em
diversas reas cientificas com o
objetivo de construrem sistemas
computacionais
poderosos
e
economicamente viveis.

INTRODUO
Conceitos Bsicos

Grade Computacional
um ambiente computacional
distribudo paralelo que tem como
objetivo
alcanar
a
interoperabilidade
entre
as
organizaes virtuais, atravs da
habilidade de cooperao, de
compartilhamento e agregao de
recursos
computacionais
geograficamente distribudos de
forma a disponibiliz-los
como
recursos e servios.

INTRODUO
Conceitos Bsicos
Camada de aplicaes
Portais de acesso e programas que exploram
a potencialidade das grids

Servios orientados aos usurios


Ambiente de programao em grid

Middleware
Servios bsicos como gesto de recursos distribuidos

Elementos bsicos
Recursos computacionais como servidores, desktops e
seus sistemas operacionais

INTRODUO
Conceitos Bsicos
Cluster

Grid

Solucionar problemas da organizao = Local

Disponibilizar recursos e servios de uma forma


geograficamente distribuda

Gerenciamento por uma autoridade central

Cada organizao virtual gerencia seus


recursos mantendo a viso nica do sistema

Voltado a performance e disponibilidade

Alm disso
servios

Custo para a organizao

Custo dissolvido entre as organizaes

prioridade

para

prestao

de

Permite latncia devido as aplicaes paralelas


Devido a natureza das aplicaes no permite
possurem pouca ou nenhuma comunicao
latncia na comunicao
entre as tasks

INTRODUO
AMBIENTE DE DESENVOLVIMENTO

INTRODUO
AMBIENTE DE DESENVOLVIMENTO

Netbeans
Passo 1: Criar um projeto;

INTRODUO
AMBIENTE DE DESENVOLVIMENTO

Netbeans
Passo 1: Criar um projeto;
Passo 2: Selecionar a categoria e o
projeto;

INTRODUO
AMBIENTE DE DESENVOLVIMENTO

Netbeans
Passo 1: Criar um projeto;
Passo 2: Selecionar a categoria e o
projeto;
Passo 3: Escolher o nome do projeto;

INTRODUO
AMBIENTE DE DESENVOLVIMENTO

Netbeans
Passo 1: Criar um projeto;
Passo 2: Selecionar a categoria e o
projeto;
Passo 3: Escolher o nome do projeto;

FUNDAMENTOS
-Transparncia
-Flexibilidade
-Confiabilidade
-Desempenho
-Escalabilidade

II

FUNDAMENTOS
TAXONOMIA DE FLYNN

FUNDAMENTOS
TAXONOMIA DE FLYNN

um nico fluxo de instrues opera sobre um nico fluxo de dados.


Exemplo: Computadores Sequenciais.

FUNDAMENTOS
TAXONOMIA DE FLYNN

Um nico fluxo de instrues opera sobre mltiplos fluxos de dados.


Exemplo: computadores vetoriais e matriciais

FUNDAMENTOS
TAXONOMIA DE FLYNN

- Na

classe MIMD est a maioria das arquiteturas paralelas da atualidade;


- MIMD Compartilhada; e
- MIMD Distribuda.
Exemplo: arquiteturas com mltiplos processadores independentes

FUNDAMENTOS
TAXONOMIA DE FLYNN

- No

existem.

FUNDAMENTOS
TAXONOMIA DE FLYNN

FUNDAMENTOS
TRANSPARNCIA

a capacidade de ocultar o fato de que


seus processos e recursos esto
fisicamente distribudos por vrios
computadores.

FUNDAMENTOS
TRANSPARNCIA
Tipos de transparncias:
- Acesso: oculta a diferena na representao de dados e no modo de
acesso a um recurso;
- Localizao: oculta o lugar em que um recurso est localizado;
- Migrao: oculta que um recurso pode ser movido para outra localizao;
- Relocao: oculta que um recurso pode ser movido para outra localizao
enquanto em uso;
- Replicao: oculta que um recurso replicado;
- Concorrncia: oculta que um recurso possa estar compartilhado entre
diversos usurios; e
- Falha: oculta a falha na recuperao de um recurso.

FUNDAMENTOS
CONFIABILIDADE

Avalia por quanto tempo um sistema


apresenta um servio correto.

FUNDAMENTOS
DESEMPENHO

Mtrica

fundamental:

quanto mais

rpido

speedup
um

executa em n computadores.

programa

FUNDAMENTOS
DESEMPENHO

Lei de Amdahl: Speedup linear quase impossvel de alcanar devido a algum


componente sequencial

FUNDAMENTOS
ESCALABILIDADE

Tipos de Escalabilidade:
- tamanho;
- geogrficos; e
- gerenciamento.

Problemas:
- servios centralizados. Ex. Um nico servidor para todos os usurios;
- dados centralizados. Ex: Uma nica lista telefnica online; e
- algoritmos centralizados: Ex: Fazer roteamento com informaes
incompletas.

Comunicao nos
Sistemas Distribudos

III
-Modelo Cliente Servidor
- Sockets

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

- BSD Unix;
- ponto de comunicao entre processos;
- transmitir mensagens atravs de sockets abertos por processos;
- um processo por porta;

Cliente

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

-Protocolos:
- TCP: Confivel
- UDP: No confivel

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR


String

8000

8000
Cliente
String

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

int serverPort = 8000;


Socket s = new Socket(args[1], serverPort);
DataInputStream in = new DataInputStream(s.
getInputStream());
DataOutputStream out = new DataOutputStream(s.
getOutputStream());
out.writeUTF(args[0]);
String data = in.readUTF();
System.out.println("Received: " + data);

Cliente

int serverPort = 8000;


ServerSocket listenSocket = new ServerSocket
(serverPort);
clientSocket = listenSocket.accept();
DataInputStream in = new DataInputStream
(clientSocket.getInputStream());
DataOutputStream out = new DataOutputStream
(clientSocket.getOutputStream());
String data = in.readUTF();
System.out.println(data);
out.writeUTF("Servidor responde " + data);

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

int serverPort = 8000;


Socket s = new Socket(args[1], serverPort);
DataInputStream in = new DataInputStream(s.
getInputStream());
DataOutputStream out = new DataOutputStream(s.
getOutputStream());
out.writeUTF(args[0]);
String data = in.readUTF();
System.out.println("Received: " + data);

Cliente

int serverPort = 8000;

ServerSocket listenSocket = new


ServerSocket(serverPort);
clientSocket = listenSocket.accept();
DataInputStream in = new DataInputStream
(clientSocket.getInputStream());
DataOutputStream out = new DataOutputStream
(clientSocket.getOutputStream());
String data = in.readUTF();
System.out.println(data);
out.writeUTF("Servidor responde " + data);

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

int serverPort = 8000;


Socket s = new Socket(args[1], serverPort);
DataInputStream in = new DataInputStream(s.
getInputStream());
DataOutputStream out = new DataOutputStream(s.
getOutputStream());
out.writeUTF(args[0]);
String data = in.readUTF();
System.out.println("Received: " + data);

Cliente

int serverPort = 8000;

ServerSocket listenSocket = new


ServerSocket(serverPort);
clientSocket = listenSocket.accept();
DataInputStream in = new DataInputStream
(clientSocket.getInputStream());
DataOutputStream out = new DataOutputStream
(clientSocket.getOutputStream());
String data = in.readUTF();
System.out.println(data);
out.writeUTF("Servidor responde " + data);

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

int serverPort = 8000;

Socket s = new Socket(serverIP,


serverPort);
DataInputStream in = new DataInputStream(s.
getInputStream());
DataOutputStream out = new DataOutputStream(s.
getOutputStream());
out.writeUTF(args[0]);
String data = in.readUTF();
System.out.println("Received: " + data);

Cliente

int serverPort = 8000;

ServerSocket listenSocket = new


ServerSocket(serverPort);
clientSocket = listenSocket.accept();
DataInputStream in = new DataInputStream
(clientSocket.getInputStream());
DataOutputStream out = new DataOutputStream
(clientSocket.getOutputStream());
String data = in.readUTF();
System.out.println(data);
out.writeUTF("Servidor responde " + data);

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

int serverPort = 8000;


Socket s = new Socket(serverIP, serverPort);

DataInputStream in = new
DataInputStream(s.getInputStream());

DataOutputStream out = new


DataOutputStream(s.getOutputStream());
out.writeUTF(args[0]);
String data = in.readUTF();
System.out.println("Received: " + data);

Cliente

int serverPort = 8000;

ServerSocket listenSocket = new


ServerSocket(serverPort);
clientSocket = listenSocket.accept();
DataInputStream in = new DataInputStream
(clientSocket.getInputStream());
DataOutputStream out = new DataOutputStream
(clientSocket.getOutputStream());
String data = in.readUTF();
System.out.println(data);
out.writeUTF("Servidor responde " + data);

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

int serverPort = 8000;


Socket s = new Socket(serverIP, serverPort);

DataInputStream in = new DataInputStream(s.


getInputStream());
DataOutputStream out = new DataOutputStream(s.
getOutputStream());

out.writeUTF("Ol");
String data = in.readUTF();
System.out.println("Received: " + data);

Cliente

int serverPort = 8000;


ServerSocket listenSocket = new ServerSocket
(serverPort);

clientSocket = listenSocket.
accept();
DataInputStream in = new DataInputStream
(clientSocket.getInputStream());
DataOutputStream out = new DataOutputStream
(clientSocket.getOutputStream());
String data = in.readUTF();
System.out.println(data);
out.writeUTF("Servidor responde " + data);

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

String
8000

Cliente

Servidor

int serverPort = 8000;


Socket s = new Socket(serverIP, serverPort);

DataInputStream in = new DataInputStream(s.


getInputStream());
DataOutputStream out = new DataOutputStream(s.
getOutputStream());

out.writeUTF("Ol");
String data = in.readUTF();
System.out.println("Received: " + data);

Cliente

int serverPort = 8000;


ServerSocket listenSocket = new ServerSocket
(serverPort);

clientSocket = listenSocket.accept();

DataInputStream in = new
DataInputStream(clientSocket.
getInputStream());
DataOutputStream out = new DataOutputStream
(clientSocket.getOutputStream());
String data = in.readUTF();
System.out.println(data);
out.writeUTF("Servidor responde " + data);

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor
String
int serverPort = 8000;

int serverPort = 8000;


Socket s = new Socket(serverIP, serverPort);

DataInputStream in = new DataInputStream(s.


getInputStream());
DataOutputStream out = new DataOutputStream(s.
getOutputStream());

out.writeUTF("Ol");

String data = in.readUTF();


System.out.println("Received: " + data);

ServerSocket listenSocket = new ServerSocket


(serverPort);

clientSocket = listenSocket.accept();
DataInputStream in = new DataInputStream
(clientSocket.getInputStream());

DataOutputStream out = new


DataOutputStream(clientSocket.
getOutputStream());
String data = in.readUTF();
System.out.println(data);

out.writeUTF("Servidor
responde " + data);

Cliente

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR


Objeto

8000

Cliente

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

public class Pessoa implements Serializable{


public String nome;
public String email;
}

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

int portaDoServidor = 8000;


String enderecoDoServidor = "127.0.0.1";
s = new Socket(enderecoDoServidor,
portaDoServidor);
ObjectOutputStream out = new
ObjectOutputStream(s.getOutputStream());
Pessoa p = new Pessoa();
p.nome="Anderson";
p.email="asantos@unicarioca.edu.br";
out.writeObject(p);

Cliente

int serverPort = 8000;


ServerSocket listenSocket = new
ServerSocket(serverPort);
clientSocket = listenSocket.
accept();
ObjectInputStream in = new
ObjectInputStream(clientSocket.
getInputStream());
Pessoa p = (Pessoa) in.
readObject();
System.out.println("Nome: " + p.
nome + " Email: " + p.email);
Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

int portaDoServidor = 8000;


String enderecoDoServidor = "127.0.0.1";
s = new Socket(enderecoDoServidor,
portaDoServidor);
ObjectOutputStream out = new
ObjectOutputStream(s.getOutputStream());
Pessoa p = new Pessoa();
p.nome="Anderson";
p.email="asantos@unicarioca.edu.br";
out.writeObject(p);

Cliente

int serverPort = 8000;


ServerSocket listenSocket =
new ServerSocket(serverPort);
clientSocket = listenSocket.
accept();
ObjectInputStream in = new
ObjectInputStream(clientSocket.
getInputStream());
Pessoa p = (Pessoa) in.
readObject();
System.out.println("Nome: " + p.
nome + " Email: " + p.email);
Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

int portaDoServidor = 8000;


String enderecoDoServidor =
"127.0.0.1";
s = new Socket(enderecoDoServidor,
portaDoServidor);
ObjectOutputStream out = new
ObjectOutputStream(s.getOutputStream());
Pessoa p = new Pessoa();
p.nome="Anderson";
p.email="asantos@unicarioca.edu.br";
out.writeObject(p);

Cliente

int serverPort = 8000;


ServerSocket listenSocket = new
ServerSocket(serverPort);
clientSocket = listenSocket.
accept();
ObjectInputStream in = new
ObjectInputStream(clientSocket.
getInputStream());
Pessoa p = (Pessoa) in.
readObject();
System.out.println("Nome: " + p.
nome + " Email: " + p.email);
Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

MODELO CLIENTE SERVIDOR

8000

Cliente

Servidor

int portaDoServidor = 8000;


String enderecoDoServidor = "127.0.0.1";
s = new Socket(enderecoDoServidor,
portaDoServidor);
ObjectOutputStream out = new
ObjectOutputStream(s.
getOutputStream());
Pessoa p = new Pessoa();
p.nome="Anderson";
p.email="asantos@unicarioca.edu.br";
out.writeObject(p);

Cliente

int serverPort = 8000;


ServerSocket listenSocket = new
ServerSocket(serverPort);
clientSocket = listenSocket.
accept();
ObjectInputStream in = new
ObjectInputStream
(clientSocket.
getInputStream());
Pessoa p = (Pessoa) in.
readObject();
System.out.println("Nome: " +
p.nome + " Email: " + p.email);
Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

UDP

- Orientado a datagrama
- No orientado a conexo
- No tem controle de fluxo, erros e sequenciamento.
- No confivel

COMUNICAO NOS SISTEMAS DISTRIBUDOS

UDP

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = args[0];
byte[] m = mens.getBytes();
InetAddress aHost = InetAddress.
getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(), aHost,
serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = args[0];
byte[] m = mens.getBytes();
InetAddress aHost = InetAddress.
getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(), aHost,
serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = args[0];
byte[] m = mens.getBytes();
InetAddress aHost = InetAddress.
getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(), aHost,
serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = args[0];
byte[] m = mens.getBytes();
InetAddress aHost = InetAddress.
getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(), aHost,
serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = args[0];
byte[] m = mens.getBytes();
InetAddress aHost = InetAddress.
getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(), aHost,
serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor
7000

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = args[0];
byte[] m = mens.getBytes();
InetAddress aHost = InetAddress.
getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(), aHost,
serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor
7000

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = Ol;
byte[] m = mens.getBytes();
InetAddress aHost = InetAddress.
getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(), aHost,
serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor
7000

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = Ol;
byte[] m = mens.getBytes();
InetAddress aHost = InetAddress.
getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(), aHost,
serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor
7000

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = Ol;
byte[] m = mens.getBytes();
InetAddress aHost =
InetAddress.getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(), aHost,
serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor
7000

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = Ol;
byte[] m = mens.getBytes();
InetAddress aHost = InetAddress.
getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(),
aHost, serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor
7000

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = Ol;
byte[] m = mens.getBytes();
InetAddress aHost = InetAddress.
getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(), aHost,
serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor
7000

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

COMUNICAO NOS SISTEMAS DISTRIBUDOS

Cliente

aSocket = new DatagramSocket();


String mens = Ol;
byte[] m = mens.getBytes();
InetAddress aHost = InetAddress.
getByName("127.0.0.1");
int serverPort = 7000;
DatagramPacket request = new
DatagramPacket(m, mens.length(), aHost,
serverPort);
aSocket.send(request);

Cliente

MODELO CLIENTE SERVIDOR


UDP

Servidor
7000

aSocket = new DatagramSocket


(7000);
byte[] buffer = new byte[1000];
DatagramPacket request = new
DatagramPacket(buffer, buffer.length);
aSocket.receive(request);
String s = new String(request.
getData());
System.out.println(request.
getAddress() + " " + s.substring(0, request.
getLength()));
System.out.println(s.length());
System.out.println(request.
getLength());
System.out.println();

Servidor

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

Definio
Permite que um programa procedural chame uma funo que reside em outro
computador to convenientemente como se esta funo fosse parte do mesmo
programa que executa, no mesmo computador.

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

CHAMADA DE PROCEDIMENTO REMOTO


click to edit master text styles

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

Definio
RPC foi desenvolvida para permitir aos programadores se concentrar nas
tarefas exigidas de um programa chamando funes e, tornando
transparente ao programador o mecanismo que permite que as partes do
aplicativo se comuniquem atravs de uma rede.

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

CHAMADA DE PROCEDIMENTO REMOTO


Funcionamento:
O cliente na inicializao localiza o servidor.
O cliente invoca um procedimento local (stub), que serializa os
parmetros (marshalling), constri uma mensagem, invoca a camada
de comunicao e bloqueia.
O servidor recebe a mensagem e:
-faz o despacho para o stub apropriado.
-este recupera os parmetros (unmarshalling), e chama o
procedimento escrito pelo programador.
-o resultado serializado e uma mensagem enviada de volta.
O stub do cliente recebe a mensagem, faz o unmarshalling e devolve a
resposta ao cdigo cliente.

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

Stubs:

Escondem os cdigos de chamada rede.


Protege as aplicaes (cliente e servidor) dos detalhes
referentes comunicao pela rede.
Cabe ao stub a passagem de parmetros entre os
procedimentos.

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

RPC-sun e rpcgen
RPC-sun : criado orginalmente para mquinas sun. Hoje disponvel em
vrios sistemas.
Constitui-se de:
Uma linguagem de definio de interfaces (RPCL).
Aplicativo rpcgen, que cria os stub de comunicao
Biblioteca RPC
Protocolo de comunicao para as aplicaes.

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

Exemplo.
Passo 1) Definir o protocolo. (rpcgen) - hello.x
$ rpcgen hello.x
program HELLOPROG {
version HELLOVERS {
string HELLOWORLD() = 1;
} = 1;
} = 0x20000044;

/*
/*
/*
/*
/*

valor de registro do programa */


versionamento do programa */
funo*/
valor da verso */
valor do programa */

Passo 2) So gerados quatro arquivos:


- hello_clnt.c (stub cliente), hello_svc.c (stub servidor), hello_xdr.c
(representao dos tipos de dados trafegados) e hello.h (header);

RPC
Unidade 3

Exemplo.
Passo 3) Desenvolvimento do programa cliente e servidor. Devem fazer
chamadas ao header (hello.h);
Passo 4) Compilar todo mundo.
a) gcc -c hellocliente.c,
b) Makefile

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3
all: generate_stubs client server
client:
$(CC) hello_c.c hello_clnt.o -o client
server:
$(CC) hello_s.c hello_svc.o -o server

generate_stubs:
rpcgen hello.x
$(CC) -c hello_clnt.c
$(CC) -c hello_svc.c
clean:
$(RM)
$(RM)
$(RM)
$(RM)
$(RM)
$(RM)

hello_clnt.*
hello_svc.*
hello.h
client
server
-fr *~

RPC
Unidade 3

#include
#include
#include
#include

<stdio.h>
<string.h>
<rpc/rpc.h>
"hello.h"

RPC

char **helloworld_1_svc(void *dump, struct svc_req *clnt) {


static char* r = new char(32);
strcpy(r,"hello world!");

#include <stdio.h>
#include <rpc/rpc.h>
#include "hello.h"

return ((char **) &r);


}

main(int argc, char *argv[]) {


CLIENT *cl;
char* answer;
if (argc < 2) {
printf("Usage: %s <server>\n", argv[0]);
exit(1);
}
if (!(cl = clnt_create(argv[1], HELLOPROG,HELLOVERS,"tcp"))) {
clnt_pcreateerror(argv[1]);
exit(1);
}
printf("1\n");
answer = *helloworld_1((void *) NULL, cl);
printf("2\n");
if (answer == 0) {
printf("error: could not produce meaningful results");
exit(1);
}
printf("%s\n", answer);
}

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

Java RMI
Java RMI permite que objetos Java executando no mesmo computador
ou em computadores separados se comuniquem entre si via chamadas
de mtodos remotos. Essas chamadas so muito semelhantes quelas
que operam em objetos no mesmo programa.
Java RMI uma implementao da RPC em Java para comunicao
distribuda de um objeto Java com outro. Um vez que um mtodo (ou
servio) de um objeto Java registrado como sendo remotamente
acessvel, um cliente pode pesquisar (lookup) esse servio e receber uma
referncia que permita ao cliente utilizar esse servio (isto , chamar o
mtodo).

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

Introduo

CORBA (Common Object Request Broker Architecture) uma tecnologia


padronizada pela OMG (Object Management Group) para oferecer
uma arquitetura de computao distribuda. Componentes so
construdos em uma das linguagens permitidas (C, C++, Java, dentre
outras) e tm suas interfaces exportadas e disponibilizadas atravs
de suas descries em uma linguagem padro denominada IDL
(Interface Definition Language). Neste contexto, componentes podem
se
comunicar,
invocando
e/ou
oferecendo
servios,
independentemente da linguagem de programao na qual foram
escritos e da localizao dos mesmos no sistema distribudo.

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

Princpios de Projeto do CORBA

Separao de interface e implementao: clientes dependem de


interfaces e no de implementaes;
Transparncia de localizao: uso do servio ortogonal
localizao do servio;
Transparncia de acesso: invocao de operaes em objetos;
Interfaces com tipos: referncias aos objetos so tipadas pelas
interfaces;
Suporte de herana mltipla de interfaces
.

CHAMADA DE PROCEDIMENTO REMOTO


Unidade 3

SOAP
SOAP um protocolo baseado em XML para troca de informaes em um
ambiente distribudo.
Os Web services so componentes que permitem s aplicaes enviar e receber
dados em formato XML Cada aplicao pode ter a sua prpria "linguagem",
que traduzida para uma linguagem universal, o formato XML.

JAVA RMI
Unidade 3

- Permite a comunicao entre objetos (distribudos ou no) se comuniquem


entre si;
- H dois requisitos: simples e de fcil uso; e o uso seja alinhado s prticas
Java. (no poderia haver diferena entre uma chamada tradicional e uma
chamada RMI); e
- Baseado em RPC (Remote Procedure Call), desenvolvido na dcada de 80.

JAVA RMI
Unidade 3

COMPOSIO:
- servidor: cria objetos remotos e cria referncias para tornar estes objetos
acessveis;
- cliente: pega as referncias a objetos remotos no servidor e invoca os
mtodos desses objetos.

JAVA RMI
Unidade 3

Cliente

Servio de
Diretrio
(RMI Registry)

3
Servidor

JAVA RMI
Unidade 3

Exemplo de implementao: Fibonacci.

Cliente

Servio de
Diretrio
(RMI Registry)

3
Servidor
(fibonacci)

JAVA RMI
Unidade 3

Interface do servio:

public interface Fibonacci extends Remote {


String calculo() throws RemoteException;
}

JAVA RMI
Unidade 3

Interface do servio:

public interface Fibonacci extends Remote {


String calculo() throws RemoteException;
}

JAVA RMI
Unidade 3

Interface do servio:

public interface Fibonacci extends Remote {


String calculo() throws RemoteException;
}

Para identificar os mtodos que podem ser acessados remotamente;

JAVA RMI
Unidade 3

Interface do servio:

public interface Fibonacci extends Remote {


String calculo() throws RemoteException;
}

Para poder invocar a exceo durante uma chamada de objeto remoto

JAVA RMI
Unidade 3
Cliente:
public class Cliente {
static Fibonacci objRemoto = null;
public static void main(String args[]) {
try {
objRemoto = (Fibonacci) Naming.lookup("//ServidorDiretrio/Fibonacci");
System.out.println("Cliente>> Informe o termo da srie: ");
int n = (new Scanner(System.in)).nextInt();
System.out.println("Fibonacci do termo de ordem " + n + " vale " + objRemoto.calculo(n));
} catch (Exception e) {
System.out.println("Exceo Cliente>> " + e.getMessage());
e.printStackTrace();
}
}
}

JAVA RMI
objetivos

Passo 1) Dois projetos


- Cliente
- Servidor

JAVA RMI
objetivos

Passo 2) Interface (nos dois projetos)


public interface Fatorial extends Remote {
public int calculo(int n) throws RemoteException;
}

JAVA RMI
objetivos

Passo 3) Servidor
3.1) Classe
extends UnicastRemoteObject implements Fatorial

JAVA RMI
objetivos

Passo 3) Servidor
3.2) Clculo
public int calculo(int n) {
if(n == 0 || n == 1) return 1;
if(n<0) return 0;
return n*calculo(n-1);
}

JAVA RMI
objetivos

Passo 3) Servidor
3.3) Main
public static void main(String[] args) throws MalformedURLException,
RemoteException {
RMIFatorialServidor servidor = new RMIFatorialServidor();
Naming.rebind("Fatorial", servidor);
System.out.println("Servidor registrado!");
}

JAVA RMI
objetivos

Passo 4) Cliente
3.3) Main
public static void main(String[] args) throws NotBoundException,
MalformedURLException, RemoteException {
fatorial = (Fatorial) Naming.lookup("//127.0.0.1/Fatorial");
System.out.println("n:");
int n = (new Scanner(System.in)).nextInt();
System.out.println(fatorial.calculo(n));
}

JAVA RMI
objetivos

Passo 5) Construo

JAVA RMI
objetivos

Passo 6) rmiregistry

Ir para a pasta das classes geradas e chamar o


rmiregistry.

JAVA RMI
objetivos

Passo 7) executar o servidor e depois o cliente.

COMPUTAO
DISTRIBUDA

IV
-Modelos de Computao
Distribuda;
-Web Services.

COMPUTAO DISTRIBUDA
objetivos

Modelos de Computao Distribuda


- RPC
- RMI
- P2P
- Grade
- Cluster
- CORBA
- Web Service

COMPUTAO DISTRIBUDA
objetivos

Web Service
- Um servio web uma soluo utilizada para a integrao de
sistemas onde softwares ou hardwares podem enviar ou receber
mensagens. Um servio web deve fornecer uma infraestrutura
para se ter uma forma mais rica e mais estruturada de
interoperabilidade entre clientes e servidores. A representao de
dados externa e o empacotamento das mensagens trocadas entre
clientes e servios web so feitos em XML (Extensible Markup
Language), o que resulta em um grupo de tipo de dados bem
vasto.

COMPUTAO DISTRIBUDA
objetivos

Arquitetura
So componentes da arquitetura de um servio web:
1. SOAP (Simple Object Access Protocol): um protocolo que
permite a troca de informaes em ambientes distribudos.
Contm as chamadas e retornos dos Web Services encapsuladas
em sua estrutura.

COMPUTAO DISTRIBUDA
objetivos

Arquitetura
So componentes da arquitetura de um servio web:
2. WSDL (Web Service Description Language): a linguagem de
descrio de Web Services, onde esto descritas as informaes
necessrias para invocao dos Web Services, como a
localizao, operaes disponveis e assinaturas de funes do
mesmo.

COMPUTAO DISTRIBUDA
objetivos

Arquitetura
So componentes da arquitetura de um servio web:
3. UDDI (Universal Description, Discovery and Integration): Uma
implementao de UDDI equivale a um Web Service Registry,
disponibilizando mecanismos para busca e publicao de Web
Services.
Ele
gerencia
informao
sobre
provedores,
implementaes e metadados de servios. Alm disso, contm
informaes sobre os servios e funcionalidades que os servios
web oferecem, permitindo uma associao desses servios com
suas informaes tcnicas.

COMPUTAO DISTRIBUDA
objetivos

Funcionamento de servios web


Um servio web acessado pelos seus clientes usando
mensagens formatadas em XML. O SOAP encapsula essas
mensagens e transmite-as por HTTP, ou por outro protocolo, por
exemplo, TCP ou SMTP. Os servios (operaes, mensagens,
parmetros etc) so descritos na WSDL. O processo de
publicao/pesquisa/descoberta utiliza o UDDI. Os Web Services
podem ser ativados por demanda ou podem funcionar
continuamente.

COMPUTAO DISTRIBUDA
objetivos

Funcionamento de servios web


As interaes entre provedor do servio (service provider), cliente
do servio (service requestor) e servidor de registro (service
registry) do base arquitetura dos Web Services. Elas so
responsveis pela publicao, busca e execuo de operaes.

COMPUTAO DISTRIBUDA
objetivos

Funcionamento de servios web


O cliente acessa o servio, atravs do provedor de servio, que
representa a plataforma onde o Web Service est hospedado. J
o cliente do servio, nada mais do que a aplicao que est
fazendo a chamada ou interao com o Web Service. E,
finalmente, o servidor de registro a representao dos servidores
de registro e busca de um Web Service.

COMPUTAO DISTRIBUDA
objetivos

Funcionamento de servios web


Resumidamente, uma definio para a tcnica do funcionamento
do Web Sevice seria: um cliente acessa o servio disponibilizado
em algum lugar da web, que foi descrito via WSDL, registrado via
UDDI, acessado utilizando SOAP e com os dados transmitidos
formatados no padro XML.

COMPUTAO DISTRIBUDA
objetivos

COMPUTAO DISTRIBUDA
objetivos

COMPUTAO DISTRIBUDA
objetivos

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

WEB SERVICES

OBRIGADO
BOA-SORTE!

Você também pode gostar