2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r...
Transcript of 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r...
2b: Camada de Aplicação 1
Programação com sockets
API Sockets apareceu no BSD4.1 UNIX
em 1981 são explicitamente
criados, usados e liberados por apls
paradigma cliente/servidor dois tipos de serviço de
transporte via API Sockets datagrama não confiável fluxo de bytes, confiável
uma interface (uma “porta”), local ao
hospedeiro, criada por e pertencente à
aplicação, e controlado pelo SO, através da qual um processo de aplicação pode tanto enviar como receber mensagens para/de outro processo de
aplicação (remoto ou local)
socket
Meta: aprender a construir aplicações cliente/servidor que se comunicam usando sockets
2b: Camada de Aplicação 2
Programação com sockets usando TCPSocket: uma porta entre o processo de aplicação e um
protocolo de transporte fim-a-fim (UDP ou TCP)Serviço TCP: transferência confiável de bytes de um
processo para outro
processo
TCP combuffers,
variáveis
socket
controlado peloprogramador de
aplicação
controladopelo sistemaoperacional
estação ouservidor
processo
TCP combuffers,
variáveis
socket
controlado peloprogramador deaplicação
controladopelo sistemaoperacional
estação ouservidor
internet
2b: Camada de Aplicação 3
Cliente deve contactar servidor
processo servidor deve antes estar em execução
servidor deve antes ter criado socket (porta) que aguarda contato do cliente
Cliente contacta servidor para:
criar socket TCP local ao cliente
especificar endereço IP, número de porta do processo servidor
Quando cliente cria socket: TCP cliente cria conexão com TCP do servidor
Quando contatado pelo cliente, o TCP do servidor cria socket novo para que o processo servidor possa se comunicar com o cliente permite que o servidor
converse com múltiplos clientes
Endereço IP e porta origem são usados para distinguir os clientes (mais no cap. 3)
TCP provê transferência confiável, ordenada de bytes
(“tubo”) entre cliente e servidor
ponto de vista da aplicação
Programação com sockets usando TCP
2b: Camada de Aplicação 4
Comunicação entre sockets
2b: Camada de Aplicação 5
Jargão para Fluxo (Stream)
Um fluxo (stream) é uma seqüência de caracteres que fluem de ou para um processo.
Um fluxo de entrada é conectado a alguma fonte de entrada para o processo, por exemplo, teclado ou socket.
Um fluxo de saída é conectado a uma fonte de saída, por exemplo, um monitor ou um socket.
2b: Camada de Aplicação 6
Programação com sockets usando TCP
Exemplo de apl. cliente-servidor:
1. cliente lê linha da entrada padrão (fluxo doUsuário), envia para servidor via socket (fluxo paraServidor)
2. servidor lê linha do socket3. servidor converte linha
para letras maiúsculas, devolve para o cliente
4. cliente lê linha modificada do socket (fluxo doServidor), imprime-a
outT
oSer
ver
to network from network
inFr
omS
erve
r
inFr
omU
ser
keyboard monitor
Process
clientSocket
inputstream
inputstream
outputstream
TCPsocket
Fluxo de entrada: Seqüência de bytes recebidos pelo processo
Fluxo de saída: Seqüência de bytes transmitidos pelo processo
Processo cliente
Socket cliente TCP
2b: Camada de Aplicação 7
Interações cliente/servidor usando o TCP
aguarda chegada de pedido de conexãosocketConexão =socketRecepção.accept()
cria socket,porta=x, parareceber pedido:
socketRecepção = ServerSocket ()
cria socket,abre conexão a nomeHosp, porta=xsocketCliente =
Socket()
fechasocketConexão
lê resposta desocketCliente
fechasocketCliente
Servidor (executa em nomeHosp) Cliente
Envia pedido usandosocketClientelê pedido de
socketConexão
escreve resposta para socketConexão
TCP setup da conexão
2b: Camada de Aplicação 8
Exemplo: cliente Java (TCP)
import java.io.*; import java.net.*; class ClienteTCP {
public static void main(String argv[]) throws Exception { String frase; String fraseModificada;
BufferedReader doUsuario = new BufferedReader(new InputStreamReader(System.in));
Socket socketCliente = new Socket(”nomeHosp", 6789);
DataOutputStream paraServidor = new DataOutputStream(socketCliente.getOutputStream());
Criafluxo de entrada
Criasocket de cliente,
conexão ao servidor
Criafluxo de saída
ligado ao socket
2b: Camada de Aplicação 9
Exemplo: cliente Java (TCP), cont.
BufferedReader doServidor = new BufferedReader(new InputStreamReader(socketCliente.getInputStream()));
frase = doUsuario.readLine();
paraServidor.writeBytes(frase + '\n');
fraseModificada = doServidor.readLine();
System.out.println(”Do Servidor: " + fraseModificada);
socketCliente.close(); } }
Criafluxo de entradaligado ao socket
Envia linhaao servidor
Lê linhado servidor
2b: Camada de Aplicação 10
Exemplo: servidor Java (TCP)import java.io.*; import java.net.*;
class servidorTCP {
public static void main(String argv[]) throws Exception { String fraseCliente; StringfFraseMaiusculas;
ServerSocket socketRecepcao = new ServerSocket(6789); while(true) { Socket socketConexao = socketRecepcao.accept();
BufferedReader doCliente = new BufferedReader(new InputStreamReader(socketConexao.getInputStream()));
Cria socketpara recepçãona porta 6789
Aguarda, no socketpara recepção, o
contato do cliente
Cria fluxo deentrada, ligado
ao socket
2b: Camada de Aplicação 11
Exemplo: servidor Java (TCP), cont
DataOutputStream paraCliente = new DataOutputStream(socketConexão.getOutputStream());
fraseCliente= doCliente.readLine();
fraseEmMaiusculas= fraseCliente.toUpperCase() + '\n';
paraClient.writeBytes(fraseEmMaiusculas); } } }
Lê linhado socket
Cria fluxode saída, ligado
ao socket
Escreve linhaao socket
Final do laço while,volta ao início e aguardaconexão de outro cliente
2b: Camada de Aplicação 12
Capítulo 2: Roteiro
2.1 Princípios dos protocolos da camada de aplicação
2.2 Web e HTTP 2.3 FTP 2.4 Correio
Eletrônico SMTP, POP3, IMAP
2.5 DNS
2.6 Compartilhamento de arquivos P2P
2.7 Programação de Sockets com TCP
2.8 Programação de Sockets com UDP
2.9 Construindo um servidor Web
2b: Camada de Aplicação 13
Programação com sockets usando UDPUDP: não tem “conexão”
entre cliente e servidor não tem “handshaking” remetente coloca
explicitamente endereço IP e porta do destino
servidor deve extrair endereço IP, porta do remetente do datagrama recebido
UDP: dados transmitidos podem ser recebidos fora de ordem, ou perdidos
UDP provê transferência não confiável de grupos de bytes (“datagramas”) entre cliente e servidor
ponto de vista da aplicação
2b: Camada de Aplicação 14
Interações cliente/servidor usando o UDP
fechasocketCliente
Servidor (executa em nomeHosp)
lê resposta dosocketCliente
cria socket,socketCliente = DatagramSocket()
Cliente
cria, endereça (nomeHosp, porta=x,envia pedido em datagramausando socketCliente
cria socket,porta=x, parapedido que chega:socketServidor = DatagramSocket()
lê pedido dosocketServidor
escreve resposta ao socketServidorespecificando endereçoIP, número de porta do cliente
2b: Camada de Aplicação 15
Exemplo: Cliente Java (UDP)
sendP
ack
et
to network from network
rece
iveP
ack
et
inF
rom
Use
r
keyboard monitor
Process
clientSocket
UDPpacket
inputstream
UDPpacket
UDPsocket
Saída: transmite pacote (o TCP enviou uma “seqüência de bytes”)
Entrada: recebe pacote (o TCP recebeu uma “seqüência de bytes”)
Processo cliente
socket cliente UDP
2b: Camada de Aplicação 16
Exemplo: cliente Java (UDP)
import java.io.*; import java.net.*; class clienteUDP { public static void main(String args[]) throws Exception { BufferedReader doUsuario= new BufferedReader(new InputStreamReader(System.in)); DatagramSocket socketCliente = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName(”nomeHosp"); byte[] dadosEnvio = new byte[1024]; byte[] dadosRecebidos = new byte[1024]; String frase = doUsuario.readLine();
dadosEnvio = frase.getBytes();
Criafluxo de entrada
Cria socket de cliente
Traduz nome de hospedeiro ao
endereço IP usando DNS
2b: Camada de Aplicação 17
Exemplo: cliente Java (UDP) cont.
DatagramPacket pacoteEnviado = new DatagramPacket(dadosEnvio, dadosEnvio.length,
IPAddress, 9876); socketCliente.send(pacoteEnviado); DatagramPacket pacoteRecebido = new DatagramPacket(dadosRecebidos, dadosRecebidos.length); socketCliente.receive(pacoteRecebido); String fraseModificada = new String(pacoteRecebido.getData()); System.out.println(“Do Servidor:" + fraseModificada); socketCliente.close(); }
}
Cria datagrama com dados para
enviar,comprimento,
endereço IP, portaEnvia datagrama
ao servidor
Lê datagramado servidor
2b: Camada de Aplicação 18
Servidor UDP
2b: Camada de Aplicação 19
Exemplo: servidor Java (UDP)
import java.io.*; import java.net.*; class servidorUDP { public static void main(String args[]) throws Exception { DatagramSocket socketServidor = new DatagramSocket(9876); byte[] dadosRecebidos = new byte[1024]; byte[] dadosEnviados = new byte[1024]; while(true) { DatagramPacket pacoteRecebido = new DatagramPacket(dadosRecebidos,
dadosRecebidos.length);
socketServidor.receive(pacoteRecebido);
Cria socketpara datagramas
na porta 9876
Aloca memória parareceber datagrama
Recebedatagrama
2b: Camada de Aplicação 20
Exemplo: servidor Java (UDP), cont
String frase = new String(pacoteRecebido.getData()); InetAddress IPAddress = pacoteRecebido.getAddress(); int porta = pacoteRecebido.getPort(); String fraseEmMaiusculas = frase.toUpperCase();
dadosEnviados = fraseEmMaiusculas.getBytes(); DatagramPacket pacoteEnviado = new DatagramPacket(dadosEnviados, dadosEnviados.length, IPAddress, porta); socketServidor.send(pacoteEnviado); } }
}
Obtém endereço IP, no.
de porta do remetente
Escrevedatagrama
no socket
Fim do laço while,volta ao início e aguardachegar outro datagrama
Cria datagrama p/ enviar ao cliente
2b: Camada de Aplicação 21
Capítulo 2: Roteiro
2.1 Princípios dos protocolos da camada de aplicação
2.2 Web e HTTP 2.3 FTP 2.4 Correio
Eletrônico SMTP, POP3, IMAP
2.5 DNS
2.6 Compartilhamento de arquivos P2P
2.7 Programação de Sockets com TCP
2.8 Programação de Sockets com UDP
2.9 Construindo um servidor Web
2b: Camada de Aplicação 22
Servidor Web Simples
Funções do servidor Web: Trata apenas um pedido HTTP por vez Aceita e examina o pedido HTTP Recupera o arquivo pedido do sistema de
arquivos do servidor Cria uma mensagem de resposta HTTP
consistindo do arquivo solicitado precedido por linhas de cabeçalho
Envia a resposta diretamente ao cliente.
2b: Camada de Aplicação 23
Servidor Web Simplesimport java.io.*;import java.net.*;import java.util.*;
class WebServer { public static void main(String argv[]) throws Exception { String requestMessageLine; String fileName;
ServerSocket listenSocket = new ServerSocket(6789); Socket connectionSocket = listenSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader( connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream( connectionSocket.getOutputStream());
Contém a classe StringTokenizer que éusada para examinar
o pedido
Aguarda conexãodo cliente
Primeira linha da mensagemde pedido HTTP e
Nome do arquivo solicitado
Cria fluxo de Entrada
Cria fluxo de Saída
2b: Camada de Aplicação 24
Servidor Web Simples, cont
requestMessageLine = inFromClient.readLine();
StringTokenizer tokenizedLine = new StringTokenizer(requestMessageLine); if (tokenizedLine.nextToken().equals("GET")){ fileName = tokenizedLine.nextToken(); if (fileName.startsWith("/") == true ) fileName = fileName.substring(1);
File file = new File(fileName); int numOfBytes = (int) file.length();
FileInputStream inFile = new FileInputStream ( fileName);
byte[] fileInBytes = new byte[]; inFile.read(fileInBytes);
Lê a primeira linha dopedido HTTP que deveria
ter o seguinte formato:GET file_name HTTP/1.0
Examina a primeira linha da mensagem para extrair
o nome do arquivo
Associa o fluxo inFile ao arquivo fileName
Determina o tamanho doarquivo e constrói um vetor
de bytes do mesmo tamanho
2b: Camada de Aplicação 25
Servidor Web Simples, cont
outToClient.writeBytes( "HTTP/1.0 200 Document Follows\r\n");
if (fileName.endsWith(".jpg")) outToClient.writeBytes("Content-Type: image/jpeg\r\n"); if (fileName.endsWith(".gif")) outToClient.writeBytes("Content-Type: image/gif\r\n"); outToClient.writeBytes("Content-Length: " + numOfBytes + "\r\n"); outToClient.writeBytes("\r\n");
outToClient.write(fileInBytes, 0, numOfBytes); connectionSocket.close(); }
else System.out.println("Bad Request Message"); }}
Transmissão do cabeçalho da resposta
HTTP.
Inicia a construção damensagem de resposta
2b: Camada de Aplicação 26
Capítulo 2: Resumo
Arquiteturas de aplicações cliente-servidor P2P híbrido
Requerimentos de serviço das aplicações: confiabilidade, banda, atraso
Modelos de serviço de transporte da Internet orientado à conexão, confiável:
TCP não confiável, datagramas: UDP
Nosso estudo sobre aplicações de rede está agora completo!
Protocolos específicos: HTTP FTP SMTP, POP, IMAP DNS
Programação socket
2b: Camada de Aplicação 27
Capítulo 2: Resumo
troca típica de mensagens pedido/resposta cliente solicita info ou serviço servidor responde com dados,
código de status
formatos de mensagens: cabeçalhos: campos com info
sobre dados (metadados) dados: info sendo comunicada
Mais importante: aprendemos sobre protocolos
msgs de controle vs. dados na banda, fora da banda
centralizado vs. descentralizado
s/ estado vs. c/ estado transferência de msgs
confiável vs. não confiável “complexidade na borda da
rede”