Sumário
•
Telecomunicações
•
Sistemas Distribuídos
•
SOA / Web Services
•
REST Web Services
REST
O que é REST e pra que serve?
REST (Representational State Transfer) foi feito para permitir a
comunicação entre duas aplicações quaisquer, independente de sua plataforma/linguagem de desenvolvimento;
Surgiu a partir de uma tese de doutorado de Roy Fielding, um dos principais autores da especificação do protocolo HTTP;
Sistemas que seguem os princípios do REST são chamados de RESTful, ou seja, REST e RESTful são a mesma coisa;
REST
O que é REST e pra que serve?
Por usar o protocolo HTTP, usa além dos métodos POST e GET, o
PUT e o DELETE, que em uma analogia com CRUD seria: UPDATE, READ, CREATE, DELETE;
REST não é um padrão, é um modelo de arquitetura;
REST
O que é REST e pra que serve?
A Web é o maior modelo de um sistema REST;
REST
REST
Recursos com múltiplas representações
Retorna um XML num formato específico.
Retorna uma informação no formato vCard (ex.: endereço do cliente)
REST
REST é um estilo de se projetar aplicativos da Web
fracamente acoplados que contam com recursos nomeados
— em forma de URL, URI e URN, por exemplo — e não com
mensagens. Engenhosamente, o REST transporta a
infraestrutura já validada e bem-sucedida da Web — HTTP.
URL: Uniform Resource Locator URI: Uniform resource identifier URN: Uniform Resource Name
REST
REST substitui a dobradinha SOAP+WSDL?
Não substitui! Pelo menos por enquanto....;
REST é Web Services assim como existem Web Services baseados
no padrão SOAP, mas REST por exemplo não possui um contrato formal, como SOAP possui, no caso o WSDL;
REST não tem estado (stateless), WS-SOAP podem possuir estado
(stateful);
REST não possui suporte a requisição assíncrona, SOAP possui;
SOAP é mais consolidado, portanto possui ferramentas de suporte e
REST
Vantagens e Desvantagens no uso de REST
Vantagens
REST usa o padrão Web (HTTP) para troca de dados, SOAP envolve uma
série de padrões (WSDL, WS-Security, WS-Addressing, WS-Coordination, WS-ReliableMessaging);
REST é mais leve, tem melhor performance para troca de dados, pois os
request/response são muito menores;
REST é mais humano, pois usa de recursos já conhecidos, o que o torna
mais fácil de usar;
Com REST é possível fazer CACHE das requisições/respostas;
É possível ter N camadas intermediárias, como: proxys, gateways, cache
REST
Vantagens e Desvantagens no uso de REST
Vantagens
É mais seguro do que SOAP, já que existe a possibilidade de usar
REST sobre HTTPS, usar os próprios recursos de segurança do padrão HTTP, além do uso de firewall e outros recursos;
Por ser mais leve, é viável utilizar REST em aplicativos móveis como
celulares, smartphones, PDA’s, etc;
REST
Vantagens e Desvantagens no uso de REST
Desvantagens
Não possui um contrato para definir a interface dos seus serviços;
Não possui ferramentas de apoio ao desenvolvimento;
Programação de Sockets
•
O que é um Socket
Uma interface
local
criada e
mantida pelas aplicações,
controlada pelo SO
, através
da qual os processos de
aplicação podem tanto
enviar
quanto
receber
mensagens
de outro processo de
aplicação, local ou remoto.
De acordo com James F Kurose:“socket é a interface entre a camada de aplicação e a de transporte
Programação de Sockets
API de Sockets:
•
introduzida no UNIX BSD 4.1,1981
•
explicitamente criados, usados e
liberados pelas aplicações
•
paradigma cliente/servidor
•
dois tipos de serviço de transporte via
sockets:
– datagrama não confiável (UDP)
– confiável, orientado a cadeias de bytes / stream (TCP)
Programação de Sockets
ARP
ARP Hardware
Interface Hardware
Interface RARPRARP
ICMP
ICMP IPIP IGMPIGMP
UDP UDP TCP TCP FTP FTP HTTP HTTP ... DNSDNS RPCRPC ... Enlace Rede Transporte Aplicação Usuário Núcleo do SO Protocolos de Internet
Programação de Sockets
TCP
Orientado a conexão Controle de erro Garantia de entrega Entrega ordenadaTCP
Orientado a conexão Controle de erro Garantia de entrega Entrega ordenadaUDP
Não necessita de conexão Sem controle de erro Mais simples e mais rápido
UDP
Não necessita de conexão Sem controle de erro Mais simples e mais rápido
Programação de Sockets
Tipos de Sockets:
• Serviço com conexão
Implementa um stream de dados (SOCK_STREAM) Protocolo TCP (tipicamente)
• Serviço sem conexão
Implementa um serviço de datagramas (SOCK_DGRAM) Protocolo UDP (tipicamente)
Programação de Sockets
socket Cria um novo descritor para comunicação
connect Iniciar conexão com servidor
write Escreve dados em uma conexão
read Lê dados de uma conexão
close Fecha a conexão
bind Atribui um endereço IP e uma porta a um socket
listen Coloca o socket em modo passivo, para “escutar” portas
accept Bloqueia o servidor até chegada de requisição de conexão
recvfrom Recebe um datagrama e guarda o endereço do emissor
sendto Envia um datagrama especificando o endereço Principais funções da API
Programação de Sockets
Números de portas:
• 1-255 reservadas para serviços padrão portas “bem conhecidas”
• 256-1023 reservado para serviços Unix
• 1-1023 Somente podem ser usadas por usuários privilegiados (super-usuário)
• 1024-4999 Usadas por processos de sistema e de usuário • 5000- Usadas somente por processos de usuário
Programação de Sockets
Uma analogia
Socket: telefone
Bind: número de telefone atribuído a um telefone
Listen: ligar a campainha para que você possa ouvir o telefonema Connet: discar um número de telefone
Accept: atender o telefone Read/Write: falar / conversar Close: despedir e desligar
Programação de Sockets
Para Cliente contatar o servidor: • processo servidor já deve estar
executando antes de ser contatado
• servidor deve ter criado socket (porta) que aceita o contato do Cliente
Quando o cliente cria o socket: cliente TCP estabelece conexão com o servidor
Quando contatado pelo cliente, o servidor cria um novo socket para comunicar-se com o cliente
• permite que o servidor converse com múltiplos clientes
Ponto de vista da aplicação
TCP fornece uma transferência confiável, em ordem de bytes
(“pipe”), entre o cliente e o servidor
Ponto de vista da aplicação
TCP fornece uma transferência confiável, em ordem de bytes
(“pipe”), entre o cliente e o servidor
Cliente contata o servidor:
• criando um socket TCP local • especificando endereço IP e
número da porta do processo servidor
Programação de Sockets
close () listen () bind () socket () accept () read () write () Servidor socket () Cliente connect () bloqueado Estabelecimento de conexãowrite () read () close () Dados (pedido) Dados resposta) ter telefone associar número ao telefone ligar campainha atender chamada desligar conversar fazer chamada desligar conversar
Programação de Sockets
In
te
ra
çã
o
C
li
en
te
/S
er
vi
d
o
r:
T
C
P
Programação de Sockets
E
x
em
p
lo
:
C
li
en
te
J
av
a
(T
C
P
)
Programação de Sockets
E
x
em
p
lo
:
C
li
en
te
J
av
a
(T
C
P
)
Programação de Sockets
E
x
em
p
lo
:
S
er
v
id
o
r
Ja
va
(T
C
P
)
Programação de Sockets
E
x
em
p
lo
:
S
er
v
id
o
r
Ja
va
(T
C
P
)
Programação de Sockets
Programação de Sockets com UDP
• UDP: não há conexão entre o cliente e o servidor
• não existe apresentação
• transmissor envia explicitamente endereço IP e porta de destino em cada mensagem • servidor deve extrair o endereço IP e porta
do transmissor de cada datagrama recebido
• UDP: dados transmitidos podem ser recebidos fora de ordem ou perdidos
Ponto de vista da aplicação UDP fornece uma transferência
não confiável de grupos de bytes (“datagramas”) entre o
cliente e o servidor. Ponto de vista da aplicação UDP fornece uma transferência
não confiável de grupos de bytes (“datagramas”) entre o
Programação de Sockets
sendto () bind () socket () recvfrom () Servidor socket () Cliente bloqueado sendto () recvfrom () Dados (pedido) Dados resposta) close () close ()Programação de Sockets
In
te
ra
çã
o
C
li
en
te
/S
er
vi
d
o
r:
U
D
P
Programação de Sockets
E
x
em
p
lo
:
C
li
en
te
J
av
a
(U
D
P
)
Programação de Sockets
E
x
em
p
lo
:
C
li
en
te
J
av
a
(U
D
P
)
Programação de Sockets
E
x
em
p
lo
:
S
er
v
id
o
r
Ja
va
(
U
D
P
)
Programação de Sockets
E
x
em
p
lo
:
S
er
v
id
o
r
Ja
va
(
U
D
P
)
Programação de Sockets
Sockets em Java
•
Java modernizou a API para trabalhar com sockets
•
O programador não precisa chamar todas as
funções, algumas chamadas são automáticas
•
Exemplos
– Socket: equivalente a socket e bind
– ServerSocket: equivalente a socket, bind e listen
•
Sockets são implementados no pacote java.net
•
A transmissão e o envio de dados são feitos através
de classes do pacote java.io de maneira semelhante
à escrita e leitura em arquivos
Programação de Sockets
•
Sockets em C/C++
•
Sockets em Java
Programação de Sockets
Sockets em C/C++
•
C é a linguagem “básica” para programação
com sockets
•
De maneira diferente de Java, programar
com sockets em C/C++ envolve utilizar todas
as chamadas da API
Programação de Sockets
import java.net.*; import java.io.*;
public class SimpleJavaClient {
public static void main(String[] args) { try {
Socket s = new Socket("127.0.0.1", 9999); InputStream i = s.getInputStream();
OutputStream o = s.getOutputStream(); String str;
do {
byte[] line = new byte[100]; System.in.read(line); o.write(line); i.read(line); str = new String(line); System.out.println(str.trim()); } while ( !str.trim().equals("bye") ); s.close(); }
catch (Exception err) {
System.err.println(err); }
} }
Programação de Sockets
#include ...
#include <sys/socket.h>
int main(int argc, char **argv) {
int s;
struct sockaddr_in dest;
char msg_write[100], msg_read[100]; s = socket(AF_INET, SOCK_STREAM, 0)); bzero(&dest, sizeof(dest));
dest.sin_family = AF_INET; dest.sin_port = htons(9999);
inet_aton(“127.0.0.1”, &dest.sin_addr.s_addr);
connect(s, (struct sockaddr*)&dest, sizeof(dest)); do {
scanf("%s",msg_write);
write (s, msg_write, strlen(msg_write)+1); read (s, msg_read, MAXBUF);
} while (strcmp(msg_read,"bye")); close(s);
Programação de Sockets
import java.io.*; import java.net.*;
public class SimpleJavaServer {
public static void main(String[] args) { try {
ServerSocket s = new ServerSocket(9999); String str; while (true) { Socket c = s.accept(); InputStream i = c.getInputStream(); OutputStream o = c.getOutputStream(); do {
byte[] line = new byte[100]; i.read(line); o.write(line); str = new String(line); } while ( !str.trim().equals("bye") ); c.close(); } }
catch (Exception err){
System.err.println(err); }
} }
Programação de Sockets
#include ...
#include <sys/socket.h>
int main(int argc, char **argv) { int s, client_s;
struct sockaddr_in self, client; int addrlen = sizeof(client);
char msg_write[100], msg_read[100];
s = socket(AF_INET, SOCK_STREAM, 0); bzero(&self, sizeof(self));
self.sin_family = AF_INET; self.sin_port = htons(9999);
self.sin_addr.s_addr = INADDR_ANY;
bind(s, (struct sockaddr*)&self, sizeof(self));
listen(s, 5); while (1) {
client_s = accept(s, (struct sockaddr*)&client, &addrlen); do {
read (client_s, msg_read, MAXBUF);
write (client_s, msg_read, strlen(msg_read)+1); } while (strcmp(msg_read,"bye"));
close(client_s); }
Programação de Sockets
Byte Order
Define como um valor é armazenado na memória. Exemplo: 16909060 = 0x01020304
Big-Endian
Little-Endian
01 02 03 04 n n+1 n+2 n+3 Endereço Memória 04 03 02 01 n n+1 n+2 n+3 Endereço MemóriaProgramação de Sockets
Byte Order
Alguns computadores armazenam os números em Big-Endian, ou seja, o Byte mais significativo primeiro.
Porém outros computadores (x86, Intel, Motorola, etc) armazenam seus dados em Little-Endian, ou seja, o byte menos
significativo primeiro
Big-Endian é também chamado de Network Byte Order, por que é a forma como os dados devem ser transmitidos em rede.
Seu computador, porém armazena números em Host Byte Order
Programação de Sockets
Byte Order
Para evitar conflitos entre hosts de arquiteturas diferentes é convencionado que informações de controle na rede são armazenadas em Big-Endian.
Para resolver esse problema temos as seguinte funções:
htons() host to network short htonl() host to network long ntohs() network to host short ntohl() network to host long
Programação de Sockets
Servidores concorrentes
Muitas vezes é necessário para um servidor lidar com vários clientes de uma única vez. Para conseguir isto é preciso, de
alguma maneira, voltar a aceitar conexões, sem esperar que um cliente seja completamente servido.
Isto normalmente é feito através da criação de novas threads ou novos processos.
Um servidor, após o retorno da função accept(), se divide em dois, e enquanto uma linha de execução se dedica a atender o cliente, outra volta a esperar por novos pedidos de conexão.
Programação de Sockets
Depuração / Exbindo mensagens de aviso
Esta é a forma mais simples de depurar aplicações que envolvem
sockets, threads e mais de um processo.
Atenção! Deve-se gerar as mensagens de aviso em ‘stderr’ (que
não possui buffer) e não ‘stdout’!
Inconveniente desta técnica de depuração: pode afetar o
Programação de Sockets
Programação de Sockets
D
ep
ur
aç
ão
/
M
áq
ui
na
d
e
es
ta
do
s
Programação de Sockets
Depuração / o comando tcpdump
tcpdump -x src host_name > log_file
Programa equivalente, com interface
Questões
1. Numa implementação onde fosse importante a ordem
de transmissão dos bytes, que tipo de socket você
usaria?
a) Datagrama (SOCK_DGRAM) b) Byte Stream (SOCK_STREAM)
2. Porque devo ter atenção especial aos endereços
(portas) de conexões quando programo sockets em
c/c++?
Devido às diferenças de representação de números
em host byte order e network byte order.
Websocket
•
É uma especificação que define uma conexão
bidirecional por canais full-duplex sobre um único socket
TCP.
•
A API Websocket Javascript foi desenvolvida como
parte da inciativa que introduziu o HTML5.
•
O padrão WebSocket simplifica muito da complexidade
em torno de comunicação bi-direcional web e do
gerenciamento de conexão.
Websocket
•
Beneficios
–
Grande diminuição de tráfego desnecessário
de rede.
–
Diminuição de latência de rede
Representa grande avanço para aplicações web que necessitam de comunicação em tempo real:
Jogos online de vários jogadores Aplicativos de Chat
Links para esportes ao vivo
Websocket
• Comparação da sobrecarga desnecessária de transferência de rede entre uma