2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r...

27
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

Transcript of 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r...

Page 1: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 2: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 3: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 4: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

2b: Camada de Aplicação 4

Comunicação entre sockets

Page 5: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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.

Page 6: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 7: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 8: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 9: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 10: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 11: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 12: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 13: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 14: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 15: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 16: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 17: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 18: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

2b: Camada de Aplicação 18

Servidor UDP

Page 19: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 20: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 21: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 22: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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.

Page 23: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 24: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 25: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 26: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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

Page 27: 2b: Camada de Aplicação1 Programação com sockets API Sockets r apareceu no BSD4.1 UNIX em 1981 r são explicitamente criados, usados e liberados por apls.

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”