Buscar

01 - Programação de Sockets

Prévia do material em texto

Programação em redes
Programação com sockets UDP e TCP
Introdução
• Os exemplos de programação de aplicações cliente/servidor (UDP e 
TCP) que aqui são apresentados baseiam-se nos descritos, de forma 
mais pormenorizada, no livro “Computer Networking – A Top-Down
Approach, 7th Edition, Kurose…”, mais especificamente, na:
• Secção 2.7 “Socket Programming: Creating Network Applications”, pág. 185 a 
197.
• As aplicações foram programadas em Python.
Application Layer 2-3
Programação de Sockets
objetivo: aprender a desenvolver aplicações
cliente/servidor que se comunicam através de sockets
socket: portas entre processos-aplicação e o protocolo de 
transporte extremo-a-extremo (end-to-end) 
Internet
controlled
by OS
controlled by
app developer
transport
application
physical
link
network
process
transport
application
physical
link
network
process
socket
Application Layer 2-4
Programação de Sockets
Dois tipos de sockets para os dois tipos de protocolo de transporte:
• UDP: entrega não fiável de datagramas (unreliable datagram)
• TCP: fiável, orientado ao fluxo de bytes (reliable,byte stream-
oriented )
Exemplo de Aplicação:
1. O cliente lê uma linha de caracteres (dados) de 
seu teclado e envia os dados para o servidor.
2. O servidor recebe os dados e converte-os 
caracteres maiúsculos.
3. O servidor envia os dados modificados para o 
cliente.
4. O cliente recebe os dados modificados e exibe-os 
no seu écran.
Application Layer 2-5
Programação de sockets com UDP
UDP: não há ligação entre cliente e servidor
• não existe “handshaking” antes do envio de dados
• O emissor coloca diretamente o IP de destino e o nº do 
porto a cada pacote a ser enviado
• O receptor a partir do pacote recebido, extrai o 
endereço IP do emissor e o nº do porto de envio
UDP: os dados transmitidos podem ser 
extraviados e/ou recebidos fora de ordem
Do ponto de vista da aplicação :
• UDP disponibiliza transferência não fiável de grupos de 
bytes (“datagrams”) entre cliente e servidor
Interação entre sockets do cliente e servidor: UDP
close
clientSocket
read datagram from
clientSocket
create socket:
clientSocket =
socket(AF_INET,SOCK_DGRAM)
Create datagram with server IP and
port=x; send datagram via
clientSocket
create socket, port= x:
serverSocket =
socket(AF_INET,SOCK_DGRAM)
read datagram from
serverSocket
write reply to
serverSocket
specifying 
client address,
port number
Application 2-6
server (running on serverIP) client
Application Layer 2-7
Exemplo de aplicação: cliente UDP 
from socket import *
serverName = ‘hostname’
serverPort = 12000
clientSocket = socket(socket.AF_INET, 
socket.SOCK_DGRAM)
message = raw_input(’Input lowercase sentence:’)
clientSocket.sendto(message,(serverName, serverPort))
modifiedMessage, serverAddress = 
clientSocket.recvfrom(2048)
print modifiedMessage
clientSocket.close()
Python UDPClient
include Python’s socket 
library
create UDP socket for 
server
get user keyboard
input 
Attach server name, port to 
message; send into socket
print out received string 
and close socket
read reply characters from
socket into string
Application Layer 2-9
Exemplo de aplicação: servidor UDP
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print “The server is ready to receive”
while 1:
message, clientAddress = serverSocket.recvfrom(2048)
modifiedMessage = message.upper()
serverSocket.sendto(modifiedMessage, clientAddress)
Python UDPServer
create UDP socket
bind socket to local port 
number 12000
loop forever
Read from UDP socket into 
message, getting client’s 
address (client IP and port)
send upper case string 
back to this client
Application Layer 2-11
Programação de sockets com TCP
Cliente deve contatar o 
servidor:
• O processo servidor já deve
estar a correr
• O servidor deve já deve ter
criado o socket (porto) para dar
as boas-vindas ao cliente
O cliente contata o servidor:
• Criando um socket TCP e 
especificando o endereço IP e o 
nº do porto do processo
servidor
• Quando o cliente cria o socket: O 
cliente TCP estabelece ligação
com o servidor TCP
• Quando contatado pelo
cliente, o server TCP cria um 
novo socket para o processo
servidor comunicar com esse
mesmo cliente em particular:
• Permitindo a interação do 
servidor com múltiplos
clientes
O TCP disponibiliza uma transferência
fiável e ordenada de um fluxo de bytes 
(“pipe”) entre o cliente e o servidor
Do ponto de vista da aplicação:
Application Layer 2-12
Client/server socket interaction: TCP
wait for incoming
connection request
connectionSocket =
serverSocket.accept()
create socket,
port=x, for incoming 
request:
serverSocket = socket()
create socket,
connect to hostid, port=x
clientSocket = socket()
server (running on hostid) client
send request using
clientSocketread request from
connectionSocket
write reply to
connectionSocket
TCP 
connection setup
close
connectionSocket
read reply from
clientSocket
close
clientSocket
Application Layer 2-13
Example app: TCP client
from socket import *
serverName = ’servername’
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName,serverPort))
sentence = raw_input(‘Input lowercase sentence:’)
clientSocket.send(sentence)
modifiedSentence = clientSocket.recv(1024)
print ‘From Server:’, modifiedSentence
clientSocket.close()
Python TCPClient
create TCP socket for 
server, remote port 12000
No need to attach server 
name, port 
Application Layer 2-15
Example app: TCP server
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocket.bind((‘’,serverPort))
serverSocket.listen(1)
print ‘The server is ready to receive’
while 1:
connectionSocket, addr = serverSocket.accept()
sentence = connectionSocket.recv(1024)
capitalizedSentence = sentence.upper()
connectionSocket.send(capitalizedSentence)
connectionSocket.close()
Python TCPServer
create TCP welcoming
socket
server begins listening for 
incoming TCP requests
loop forever
server waits on accept()
for incoming requests, new 
socket created on return
read bytes from socket (but 
not address as in UDP)
close connection to this 
client (but not welcoming 
socket)

Continue navegando