0% encontró este documento útil (0 votos)
4 vistas42 páginas

Guía de Programación de Sockets en Python

La programación de sockets en Python permite construir aplicaciones cliente/servidor que se comunican a través de conexiones de red. Existen dos tipos principales de sockets: TCP, que es confiable y orientado a la conexión, y UDP, que es no confiable y basado en datagramas. El documento detalla cómo crear, vincular y aceptar conexiones, así como ejemplos de implementación para ambos tipos de sockets.

Traducido por

ScribdTranslations
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
4 vistas42 páginas

Guía de Programación de Sockets en Python

La programación de sockets en Python permite construir aplicaciones cliente/servidor que se comunican a través de conexiones de red. Existen dos tipos principales de sockets: TCP, que es confiable y orientado a la conexión, y UDP, que es no confiable y basado en datagramas. El documento detalla cómo crear, vincular y aceptar conexiones, así como ejemplos de implementación para ambos tipos de sockets.

Traducido por

ScribdTranslations
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Programación de Sockets

Un socket es una especie de descriptor de archivo que se utiliza


referirse a una conexión de red hecha entre
la computadora, a menudo conocida como el cliente, y
cualquier host remoto.
construir aplicaciones cliente/servidor que
comunicar usando sockets
La programación de sockets en python es algo
similar a la manipulación de archivos
es el concepto de archivos y descriptores de archivos
implementado de tal manera que una conexión es
considerado como un archivo.
Para poder usar las funciones de socket, debes
importar el módulo socket.
Principios de Python 2-1
Programación de sockets

socket:puerta entre el proceso de aplicación y el extremo a extremo


protocolo de transporte

aplicación aplicación
enchufe controlado por
proceso proceso desarrollador de aplicaciones

transporte transporte
red red controlado
enlace por SO
enlace Internet
físico físico

2-2
Conceptos Básicos de Python
Creando un Socket
Cada capa utiliza la capa de abajo
. La capa inferior añade encabezados a los datos de la
capa superior
. Los datos de la capa superior también pueden ser un encabezado
en datos de la capa superior ...

DATOS DELPROTOCOLO
Capa superior

Capa inferior HDR DATOS

2-3
Fundamentos de Python
Características de UDP
También basado en datagramas
. Sin conexión, poco fiable, puede transmitir
Las aplicaciones suelen ser basadas en mensajes
. Sin reintentos de capa de transporte
. Las aplicaciones manejan (o ignoran) errores
Procesos identificados por número de puerto
Los servicios viven en puertos específicos
. Generalmente por debajo de 1024, requiriendo privilegio

2-4
Conceptos básicos de Python
Características de TCP
Orientado a la conexión
. Dos extremos de un circuito virtual
Confiable
. La aplicación no necesita verificación de errores

Basado en flujo
. Sin tamaño de bloque predefinido
Procesos identificados por números de puerto
Los servicios viven en puertos específicos

2-5
Fundamentos de Python
Socket: Vista Conceptual

2-6
Fundamentos de Python
Dos tipos esenciales de enchufes
SOCK_DGRAM
SOCK_STREAM
. también conocido como UDP
. también conocido como TCP
. entrega poco fiable
. entrega confiable
. sin garantías de pedido
. en orden garantizado
. sin noción de “conexión” – aplicación
. orientado a conexiones indica destino para cada paquete
. bidireccional . puede enviar o recibir

Aplicación

3 2 Aplicación D1
1
enchufe Dest.
3 2
1
enlace D2

D3
Conceptos de Cliente/Servidor

El servidor abre un puerto específico


. El asociado con su servicio
. Entonces solo espera solicitudes
. El servidor es el abridor pasivo
Los clientes obtienen puertos efímeros
. Garantizado único, 1024 o mayor
. Los usa para comunicarse con el servidor
. El cliente es el abridor activo

2-8
Fundamentos de Python
Servicios sin conexión

socket() socket()

bind() bind()

recvfrom() sendto()

[bloqueado] recvfrom()
[bloqueado]
enviar()

SERVIDOR CLIENT
2-9
Fundamentos de Python
Servidor Simple sin Conexión
desde socket import socket,
AF_INET, SOCK_DGRAM
s = socket(AF_INET, SOCK_DGRAM)
[Link](('[Link]', 11111))
mientras True:
datos, addr = [Link](1024)
print "Conexión de", addr
[Link]([Link](), addr)

2-10
Conceptos básicos de Python
Cliente simple sin conexión
desde socket import
s = socket(AF_INET, SOCK_DGRAM)
[Link](('[Link]', 0))
imprimir "usando", [Link]()
server = ('[Link]', 11111)
[Link]("MixedCaseString", servidor)
data, addr = [Link](1024)
imprimir "recibido", datos, "de", addr
[Link]()

2-11
Fundamentos de Python
Servicios Orientados a Conexión
socket() Servidor Cliente
bind()
socket()

escuchar()
conectar()

aceptar()
escribir()
[bloqueado]
leer()

leer() [bloqueado]

[blocked]

escribir()
Cuando la interacción ha terminado, servidor
bucles para aceptar una nueva conexión

2-12
Fundamentos de Python
Servidor simple orientado a conexiones

desde socket import \


socket, AF_INET, SOCK_STREAM
s = socket(AF_INET, SOCK_STREAM)
[Link](('[Link]', 9999))
[Link](5) # conexiones en cola máximas
mientras True:
sock, addr = [Link]()
usar el socket sock para comunicarse
# con el proceso del cliente

La conexión del cliente crea un nuevo socket


. Devuelto con dirección por accept()
El servidor maneja un cliente a la vez

2-13
Conceptos Básicos de Python
Cliente de Conexión Orientada Simple
s = socket(AF_INET, SOCK_STREAM)
[Link]((HOST, PUERTO))
[Link]('Hola, mundo')
datos = [Link](1024)
[Link]()
imprimir 'Recibido', datos

This is a simple example


. Envía mensaje, recibe respuesta
. El servidor recibe 0 bytes después de close()

2-14
Conceptos Básicos de Python
Creando un socket
La función socket del módulo socket es
solía abrir un nuevo socket de manera similar
forma en que se utiliza open() para abrir archivos.
Toma dos argumentos: la familia del socket y
el tipo de socket.
Familias de sockets:
. AF_INET: IPv4 (probablemente usarás esto)
. AF_INET6: IPv6
. AF_UNIX: dominio unix
Tipos de conectores:
. SOCK_STREAM: TCP, utilizado para conexiones fiables
. SOCK_DGRAM: UDP, utilizado para juegos y utilidades
. SOCK_RAW: un socket crudo

2-15
Fundamentos de Python
Creando un Socket
importar socket
sock = [Link](socket.AF_INET,
socket.SOCK_STREAM)

Una vez que se ha creado un socket, has abierto un


descriptor de archivo en bruto que python sabe que está destinado a
representar un tipo específico de conexión de red
Al igual que los archivos, los sockets se cierran con close()
función del módulo de socket.

2-16
Fundamentos de Python
Programación de sockets servicios de transporte:

Dos tipos de sockets para dos servicios de transporte:


. UDP:unreliable datagram
. TCP: confiable, orientado a flujo de bytes

Ejemplo de Aplicación:
1. El cliente lee una línea de caracteres (datos) de su

teclado y envía los datos al servidor.


[Link] servidor recibe los datos y los convierte

CARACTERES EN MAYÚSCULAS.
3. El servidor envía los datos modificados al cliente.
[Link] cliente recibe los datos modificados y los muestra

la línea en su pantalla.
2-17
Conceptos Básicos de Python
Programación de sockets con UDP
UDP: no hay "conexión" entre el cliente y el servidor
no hay apretón de manos antes de enviar datos
el remitente adjunta explícitamente la dirección de destino IP y
puerto # a cada paquete
rcvr extrae la dirección IP y el puerto# del remitente de
paquete recibido
UDP: transmitted data may be lost or received
fuera de servicio
Punto de vista de la aplicación:
UDP proporciona una transferencia no confiable de grupos de bytes
(“datagramas”) entre el cliente y el servidor

2-18
Fundamentos de Python
Programación de sockets con UDP...

Cuando se utiliza UDP, el servidor crea un socket y


vincula(s) dirección(es) y un número de puerto a ello.
El servidor luego espera datos entrantes
(recuerda: UDP es sin conexión).
Los clientes también crean un socket, luego lo enlazan a
la interfaz apropiada
El cliente envía datos al servidor, que despierta
desde su estado bloqueado y comienza a calcular su
respuesta.
sendto() es una función que envía paquetes a la
socket. Toma dos tuplas (nombreServidor, Puerto)
recvfrom(buflen): Recibir datos del socket,
hasta buflen bytes, devolviendo también el host remoto
y el puerto del cual provino la data 2-19
Fundamentos de Python
Interacción de socket cliente/servidor: UDP

servidor(ejecutándose enserverIP) cliente


crear socket:
crear socket, puerto= x: clienteSocket =
serverSocket = socket(AF_INET,SOCK_DGRAM)
socket(AF_INET,SOCK_DGRAM)
Crea un datagrama con la dirección IP del servidor y
puerto=x; enviar datagrama a través de
leer datagrama de socketCliente
socketServidor

escribe respuesta a
socket del servidor leer datagrama de
especificando clienteSocket
dirección del cliente
número de puerto cerrar
socketCliente

2-20
Fundamentos de Python
Aplicación 2-20
Ejemplo de aplicación: cliente UDP

Cliente UDP de Python


incluir el socket de Python
biblioteca desde socket importar *
serverName = ‘[Link]’
serverPort = 12000
crear socket UDP para clientSocket = socket(AF_INET,SOCK_DGRAM)
servidor
obtener teclado del usuario
message = raw_input(’Input lowercase sentence:’)
entrada [Link](mensaje, (nombreServidor, puertoServidor))
Adjuntar nombre del servidor, puerto a
message; send into socket modifiedMessage, serverAddress =
leer caracteres de respuesta de [Link](2048)
socket en cadena
print modifiedMessage
imprimir el string recibido [Link]()
y cerrar el socket

2-21
Fundamentos de Python
Aplicación de ejemplo: servidor UDP

Servidor UDP de Python

de socket importar *
serverPort = 12000
crear socket UDP serverSocket = socket(AF_INET,SOCK_DGRAM)
vincular socket al puerto local
número 12000
[Link](('', serverPort))
El servidor está listo para recibir
bucle para siempre mientras 1:
Leer desde el socket UDP en message, clientAddress = [Link](2048)
mensaje, obteniendo cliente's
dirección (IP y puerto del cliente) modifiedMessage = [Link]()
ENVÍE UNA CADENA EN MAYÚSCULAS [Link](modifiedMessage, clientAddress)
de vuelta a este cliente

2-22
Conceptos básicos de Python
Programación de sockets con TCP
el cliente debe contactar al servidor cuando se contactó con el cliente,
el proceso del servidor debe ser primero el servidor TCP crea un nuevo socket
corriendo para el proceso del servidor a
el servidor debe haber creado comunicar con eso
socket (puerta) que da la bienvenida cliente particular
contacto del cliente . permite que el servidor hable con
el cliente contacta al servidor mediante:
múltiples clientes
. números de puerto fuente utilizados
Creando socket TCP, para distinguir a los clientes
especificando dirección IP, puerto (más en el Capítulo 3)
número de procesos del servidor
cuando el cliente crea el socket: punto de vista de la aplicación:
el cliente TCP establece TCP proporciona un servicio confiable y en orden
conexión al servidor TCP transferencia de flujo de bytes (“tubería”)
entre el cliente y el servidor

2-23
Fundamentos de Python
Conectando un socket
Después de que se crea el socket, es necesario conectar el
socket a un host remoto. Esto se hace con connect()
función en el lado del cliente.
La función connect() toma dos argumentos
. el nombre de host en forma de cadena, y un número de puerto para conectarse a
forma entera.
importar socket
sock = [Link](socket.AF_INET,
socket.SOCK_STREAM)
[Link]((
Si eres el cliente de tu conexión, necesitas
no te preocupes por Bindear y Aceptar, y puedes
pasar a Envío y Recepción.

24
Fundamentos de Python
Vinculando y Aceptando
Esto es relevante solo si su enchufe está destinado a
ser un servidor.
Encuadernación
Si estás planeando aceptar entradas
conexiones, debes enlazar tu socket.
Mientras que conectar forma una conexión con un
socket remoto
la vinculación le dice a su socket que debe usar un
puerto específico al buscar entrante
conexiones.

25
Fundamentos de Python
Vinculando y Aceptando…
Vinculas un socket utilizando la función bind()
que toma 2 argumentos:
el nombre de host que deseas vincular, y el
puerto al que desea vincularse.
En general, el nombre de host será tu nombre de host,
así que puedes usar la función gethostbyname()
del módulo socket como el nombre del host
argumento.
Una vez que está vinculado a tu nombre de host y a un
puerto específico, el socket sabe que cuando se le indica a
Escucha, debería escuchar en ese puerto.

26
Fundamentos de Python
Vinculando y Aceptando…
importar socket
servidor = [Link](socket.AF_INET,
socket.SOCK_STREAM
[Link]([Link](), 123) o
[Link]("", 31337) o
Escuchar
Una vez que el socket está vinculado a un puerto, debes decir
escuchar en ese puerto.
Escuchar; se refiere a monitorear un puerto para que
puede manejar cualquier cosa que intente conectarse a eso
puerto.

27
Conceptos básicos de Python
Vinculando y Aceptando…
La función listen() hace esto, escuchando a
intentos de conexión.
Toma un argumento, un valor entero
representing the maximum number of queued
intentos de conexión para mantener antes de caer
los más viejos.
importar socket
servidor = [Link](socket.AF_INET,
socket.SOCK_STREAM
[Link]("", 123)
[Link](1) #escucha en el puerto 123 y encola solo 1
conexión a la vez
Después de que se establece una conexión, debe ser aceptada.
28
Fundamentos de Python
Vinculando y Aceptando…
Aceptando
listen() encuentra intentos de conexión, pero debes
úsalos luego acéptalos para formar una conexión
entre tu anfitrión y el cliente remoto.
Usas la función apropiadamente llamada accept() en
ordenar hacer esto.
importar socket
servidor = [Link](socket.AF_INET,
socket.SOCK_STREAM
[Link]("")123
[Link](1)
conexión, sock_addr = [Link]()

29
Fundamentos de Python
Vinculando y Aceptando…
Como puedes ver, la función accept() crea un
enchufe completamente nuevo
tu socket original (en este caso 'sock') puede
sigue escuchando para nuevas conexiones
mientras que el socket recién creado (en este caso
la 'conexión' se puede usar para enviar y recibir datos
del cliente. Participante Pasivo
un-calcetín-1 l-calcetín un-calcetín-2

enchufe enchufe
Activo 1 Activo 2
30
Fundamentos de Python
Envío y Recepción
Whether you have connected to a remote host or
aceptó una conexión de un cliente, enviando y
recibir es lo que permite que los datos sean transferidos.
Las funciones thesend() y recv() del socket
los módulos son básicamente idénticos - el único
la diferencia es si se están enviando datos o
recibido.
Ambos toman un argumento
send() toma los datos a enviar como un argumento,
recv() toma el número de bytes a recibir
como argumento. recv() devuelve los datos recibidos.

31
Fundamentos de Python
Enviando y recibiendo...
sock = [Link](socket.AF_INET,
socket.SOCK_STREAM
[Link](("[Link]", 123
nickname = "NICK mamush”
encoded_nick = bytes(nickname, 'utf-8')
[Link](encoded_nick)
[Link](encoded_user)

32
Fundamentos de Python
Interacción de socket cliente/servidor: TCP
servidor(ejecutándoseenid de host) cliente
crear socket
puerto=x, para entrada
solicitud:
servidorSocket = socket()

esperar la llegada crear socket


solicitud de conexión
TCP conectar a hostid, puerto=x
configuración de conexión
connectionSocket = clientSocket = socket()
[Link]()

enviar solicitud usando


leer solicitud de clienteSocket
socketDeConexión

escribe una respuesta a

socketDeConexión leer respuesta de


clienteSocket
cerrar
socketDeConexión cerrar
clienteSocket

2-33
Fundamentos de Python
Aplicación de ejemplo: cliente TCP

Cliente TCP de Python

de socket importar *
serverName = ’servername’
crear socket TCP para serverPort = 1200
servidor, puerto remoto 12000
clientSocket = socket(AF_INET,SOCK_STREAM)
[Link]((nombreDelServidor, puertoDelServidor))
sentence = raw_input(‘Input lowercase sentence:’)
No es necesario adjuntar el servidor.
[Link](frase)
name, port
modifiedSentence = [Link](1024)
imprimir 'Del Servidor:', sentenceModificado
[Link]()

2-34
Fundamentos de Python
Ejemplo de aplicación: servidor TCP

Servidor TCP de Python


desde socket importar *
crear bienvenida TCP
serverPort = 1200
enchufe serverSocket = socket(AF_INET, SOCK_STREAM)
[Link](('',serverPort))
el servidor comienza a escuchar por
solicitudes TCP entrantes
[Link](1)
El servidor está listo para recibir
bucle para siempre
mientras 1:
el servidor espera en accept() connectionSocket, addr = [Link]()
para solicitudes entrantes, nuevo
socket creado en el retorno
sentence = [Link](1024)
leer bytes del socket (pero
no dirección como en UDP) capitalizedSentence = [Link]()
cerrar conexión a esto
[Link](oraciónCapitalizada)
cliente (pero no acogedor [Link]()
enchufe
2-35
Fundamentos de Python
Módulos de Internet de Python
Una lista de algunos módulos importantes en la red/internet de Python
programación.
Protocol Common function Port No módulo de Python

HTTP Páginas web 80 httplib, urllib, xmlrpclib

NNTP Noticias de Usenet 119 nntplib

FTP Transferencias de archivos 20 ftplib, urllib

SMTP Enviando correo electrónico 25 smtplib

POP3 Recuperando correo electrónico 110 poplib

IMAP4 Recuperando correo electrónico 143 imaplib

Telnet Líneas de comando 23 telnetlib

Gopher Transferencias de documentos 70 gopherlib, urllib 2-36


Fundamentos de Python
Usando smtplib
s = [Link]([host[, puerto]])
. Crear objeto SMTP con los parámetros de conexión dados
r = [Link](from, to, msg
[, mopts[, ropts]]
. dedirección del remitente
. to lista de direcciones de destinatarios
. mensajeMensaje en formato RFC822 (incluyendo todo lo necesario)
encabezados)
. mopts, ropts Listas de opciones ESMTP

2-37
Fundamentos de Python
Ejemplo de SMTP
importar smtplib
smtpObj = [Link]("localhost")
sender ='nebfikru@[Link]'
receivers = ['[Link]@[Link]']
message = """From:<nebfikru@[Link]>
Para: <[Link]@[Link]>
Subject: SMTP e-mail test

Este es un mensaje de correo electrónico de prueba.


"""
[Link](sender, receivers, message)

Correo electrónico enviado con éxito

2-38
Fundamentos de Python
Capítulo 2: resumen
our study of network apps now complete!
arquitecturas de aplicaciones protocolos específicos:
. cliente-servidor . HTTP
. P2P . FTP
servicio de aplicación
. SMTP, POP, IMAP
requirements:
. reliability, bandwidth, . DNS
retraso . P2P: BitTorrent, DHT
Servicio de transporte por Internet
programación de sockets: TCP
modelo Sockets UDP
. orientado a conexión
reliable: TCP
. no confiable, datagramas:
UDP
2-39
Fundamentos de Python
Capítulo 2: resumen
lo más importante: ¡aprendí sobre protocolos!

solicitud/respuesta típica temas importantes:


intercambio de mensajes
control vs. mensajes de datos
. el cliente solicita información o
servicio . in-band, out-of-band
. el servidor responde con centralized vs. decentralized
data, status code sin estado vs. con estado
formatos de mensaje:
reliable vs. unreliable msg
. encabezados: campos que dan
información sobre datos transferir
. datos: información que está siendo complejidad en la red
comunicado borde

2-40
Conceptos Básicos de Python
Capítulo 1
Diapositivas adicionales

2-41
Fundamentos de Python
aplicación
paquete (navegador www,
cliente de correo electrónico
analizador
aplicación

SO
paquete Transport(TCP/UDP)

captura copia de todo Red(IP)


Ethernet
marcos Enlace (Ethernet)
(pcap) sent/receive
d Físico

2-42
Fundamentos de Python

También podría gustarte