Guía de Programación de Sockets en Python
Guía de Programación de Sockets en Python
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
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
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
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
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)
2-16
Fundamentos de Python
Programación de sockets servicios de transporte:
Ejemplo de Aplicación:
1. El cliente lee una línea de caracteres (datos) de su
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...
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
2-21
Fundamentos de Python
Aplicación de ejemplo: servidor UDP
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()
2-33
Fundamentos de Python
Aplicación de ejemplo: cliente TCP
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
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
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!
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)
2-42
Fundamentos de Python