REDES DE
COMPUTADORES
Camada de Aplicação – Sockets
Prof. Bruno Guazzelli Batista
brunoguazzelli@[Link]
Créditos
Os slides integrantes deste material foram atualizados a
partir das notas de aulas dos professores:
Prof. Luciana A. F. Martimiano (UEM)
Prof. Kalinka R. L. J. C. Branco (ICMC-USP)
Prof. Julio Cesar Estrella (ICMC-USP)
Redes de Computadores e a Internet
Kurose e Ross - Editora Pearson
2
PROGRAMAÇÃO
COM SOCKETS
3
Programação com Sockets
Meta: aprender a construir aplicações cliente/servidor que
se comunicam usando sockets
socket
API Sockets
• apareceu no BSD4.1 UNIX uma interface (uma
em 1981 “porta”), local ao host,
• são explicitamente criados, criada por ele pertencente
usados e liberados por à aplicação, controlado
aplicações pelo SO, através da qual
• paradigma cliente/servidor um processo de
• dois tipos de serviço de aplicação pode tanto
transporte via API Sockets enviar como receber
– datagrama não confiável mensagens para/de outro
– fluxo de bytes, confiável processo de aplicação
(remoto ou local)
4
Programação com Sockets usando TCP
Socket: uma porta entre o processo de aplicação e um
protocolo de transporte fim-a-fim
Serviço TCP: transferência confiável de bytes de um
processo para outro
controlado pelo
controlado pelo processo programador de
programador de processo
aplicação
aplicação socket socket
TCP com TCP com controlado
controlado
buffers, pelo sistema
pelo sistema buffers, internet variáveis operacional
operacional variáveis
estação ou estação ou
servidor servidor
5
Programação com Sockets usando
TCP
Cliente deve contactar servidor • Quando cliente cria socket: TCP do
• processo servidor deve antes cliente estabelece conexão com
estar em execução TCP do servidor
• servidor deve antes ter criado • Quando contatado pelo cliente, o
socket (porta) que aguarda TCP do servidor cria socket novo
contato do cliente para que o processo servidor possa
se comunicar com o cliente
Cliente contacta servidor para:
– permite que o servidor converse
• criar socket TCP local ao com múltiplos clientes
cliente
• especificar endereço IP, ponto de vista da aplicação
número de porta do processo TCP provê transferência
servidor confiável, ordenada de bytes
(“tubo”) entre cliente e servidor
6
Comunicação entre Sockets
7
Exemplo de Aplicação Cliente-Servidor
Fluxo de entrada: sequência de
1. cliente lê linha da entrada bytes recebida pelo
padrão (fluxo doUsuário), processo
envia para servidor via socket
Fluxo de saída: sequência de
(fluxo paraServidor)
bytes transmitida pelo
2. servidor lê linha do socket processo
3. servidor converte linha para
letras maiúsculas, devolve
para o cliente Objetivo: servidor
4. cliente lê linha modificada do
converte todas as letras
socket (fluxo doServidor), e digitadas pelo cliente
a imprime para maiúsculas
(mostra no monitor)
8
Interações
cliente/servidor
usando o TCP
9
Exemplo: Cliente Java (TCP)
Contém classes
import [Link].*; para Streams IO
import [Link].*;
class ClienteTCP { Contém classes para
suporte à rede
public static void main(String argv[]) throws Exception
{
String frase;
String fraseModificada;
Cria fluxo de
entrada BufferedReader doUsuario =
padrão new BufferedReader(new InputStreamReader([Link]));
Cria socket de
cliente, conexão Socket socketCliente = new Socket(”hostname", 6789);
ao servidor
Cria fluxo de DataOutputStream paraServidor =
saída ligado new DataOutputStream([Link]());
ao socket
10
Exemplo: Cliente Java (TCP),
cont.
Cria BufferedReader doServidor =
fluxo de entrada new BufferedReader(new
ligado ao socket InputStreamReader([Link]()));
frase = [Link]();
Envia linha
ao servidor [Link](frase + '\n');
Lê linha fraseModificada = [Link]();
do servidor
[Link](”Do Servidor: " + fraseModificada);
[Link]();
}
}
11
Exemplo: Servidor Java (TCP)
import [Link].*; Contém classes
import [Link].*; para Streams IO
Contém classes para
class servidorTCP {
suporte à rede
public static void main(String argv[]) throws Exception
{
String fraseCliente;
Cria socket String fraseMaiusculas;
para recepção
ServerSocket socketRecepcao = new ServerSocket(6789);
na porta 6789
while(true) {
Aguarda, no socket
de recepção, o Socket socketConexao = [Link]();
contato do cliente
BufferedReader doCliente =
Cria fluxo de new BufferedReader(new
entrada, ligado InputStreamReader([Link]()));
ao socket
12
Exemplo: Servidor Java (TCP), cont
Cria fluxo
de saída, ligado DataOutputStream paraCliente =
ao socket new DataOutputStream(socketConexã[Link]());
Lê linha
do socket fraseCliente= [Link]();
fraseEmMaiusculas= [Link]() + '\n';
Escreve linha
[Link](fraseEmMaiusculas);
ao socket
}
}
} Final do laço while,
volta ao início e aguarda
conexão de outro cliente
13
Programação com Sockets usando UDP
UDP: não tem “conexão” entre
cliente e servidor ponto de vista da aplicação
• não tem “handshaking” UDP provê transferência
não confiável de grupos
• remetente coloca
de bytes (“datagramas”)
explicitamente endereço IP e
entre cliente e servidor
porta do destino
• servidor deve extrair endereço
IP, porta do remetente do Objetivo: servidor converte todas
datagrama recebido as letras digitadas pelo cliente para
UDP: dados transmitidos podem maiúsculas (mostra no monitor)
ser recebidos fora de ordem,
ou perdidos
14
Interações Cliente/Servidor usando o UDP
Servidor (executa em hostid) Cliente
cria socket,
porta=x, para cria socket,
socketCliente =
pedido que chega: DatagramSocket()
socketServidor =
DatagramSocket()
cria endereço (hostid, porta=x)
envia pedido em datagrama
usando socketCliente
lê pedido do
socketServidor
escreve resposta
ao socketServidor
especificando endereço lê resposta do
IP e o número de porta socketCliente
do cliente
fecha
socketCliente
15
Exemplo: Cliente Java (UDP)
import [Link].*;
import [Link].*;
class clienteUDP {
public static void main(String args[]) throws Exception
{
Cria
fluxo de entrada BufferedReader do Usuario=
new BufferedReader(new InputStreamReader([Link]));
Cria
socket de cliente DatagramSocket socketCliente = new DatagramSocket();
Traduz nome de
InetAddress IPAddress = [Link](”nomeHosp");
hospedeiro ao
endereço IP byte[] sendData = new byte[1024];
usando DNS byte[] receiveData = new byte[1024];
String frase = [Link]();
sendData = [Link]();
16
Exemplo: Cliente Java (UDP) cont.
Cria datagrama
com dados para
DatagramPacket pacoteEnviado =
enviar,
new DatagramPacket(dadosEnvio, [Link],
comprimento, IPAddress, 9876);
endereço IP, porta
Envia datagrama [Link](pacoteEnviado);
ao servidor
DatagramPacket pacoteRecebido =
new DatagramPacket(dadosRecebidos, [Link]);
Lê datagrama
do servidor [Link](pacoteRecebido);
String fraseModificada =
new String([Link]());
[Link](”Do Servidor:" + fraseModificada);
[Link]();
}
}
17
Exemplo: Servidor Java (UDP)
import [Link].*;
import [Link].*;
class servidorUDP {
public static void main(String args[]) throws Exception
Cria socket {
para datagramas
DatagramSocket socketServidor = new DatagramSocket(9876);
na porta 9876
byte[] dadosRecebidos = new byte[1024];
byte[] dadosEnviados = new byte[1024];
while(true)
{
Aloca memória para DatagramPacket pacoteRecebido =
new DatagramPacket(dadosRecebidos,
receber datagrama
[Link]);
Recebe [Link](pacoteRecebido);
datagrama
18
Exemplo: Servidor Java (UDP), cont
String frase = new String([Link]());
Obtém
endereço IP, no. InetAddress IPAddress = [Link]();
de porta do
remetente int porta = [Link]();
String fraseEmMaiusculas = [Link]();
dadosEnviados = [Link]();
Cria datagrama p/
DatagramPacket pacoteEnviado =
enviar ao cliente new DatagramPacket(dadosEnviados,
[Link], IPAddress, porta);
Escreve
datagrama [Link](pacoteEnviado);
para o socket }
}
} Fim do laço while,
volta ao início e aguarda
chegar outro datagrama
19
Leitura Recomendada
• Tanenbaum, Redes de Computadores, 4ª
ed., 2003
– Capítulo 07
• Kurose & Ross, Redes de Computadores e
a Internet, 3ª ed., 2006
– Capítulo 02
20
Dúvidas
21