Programación de Redes en Python: Sockets y Protocolos Avanzados
Python proporciona dos niveles de acceso a servicios de red. A bajo nivel, puedes acceder al soporte básico de sockets del sistema operativo subyacente, permitiendo implementar clientes y servidores para protocolos orientados a conexión y sin conexión.
Python también tiene bibliotecas para acceso de alto nivel a protocolos de aplicación específicos como FTP, HTTP, etc.
Este capítulo cubre el concepto más famoso en redes: Programación de Sockets.
¿Qué son los Sockets?
Los sockets son los extremos de un canal de comunicaciones bidireccional. Pueden comunicarse dentro de un proceso, entre procesos en la misma máquina, o entre procesos en diferentes continentes.
Los sockets pueden implementarse sobre diferentes tipos de canal: sockets de dominio Unix, TCP, UDP, etc. La biblioteca socket proporciona clases específicas para transportes comunes e una interfaz genérica para el resto.
Vocabulario de Sockets
| Término | Descripción |
|---|---|
| Domain (Dominio) | Familia de protocolos usada como mecanismo de transporte. Constantes: AF_INET, PF_INET, PF_UNIX, PF_X25, etc. |
| Type (Tipo) | Tipo de comunicación: SOCK_STREAM (orientado a conexión, TCP) y SOCK_DGRAM (sin conexión, UDP). |
| Protocol (Protocolo) | Normalmente cero, identifica variante de protocolo dentro de dominio y tipo. |
| Hostname | Identificador de interfaz de red: nombre de host, dirección IP (IPv4/IPv6), "<broadcast>", cadena vacía (INADDR_ANY), o entero (dirección binaria). |
| Port (Puerto) | Cada servidor escucha en uno o más puertos. Número, cadena con número, o nombre de servicio. |
El Módulo socket
Para crear un socket, usa socket.socket() del módulo socket:
s = socket.socket(socket_family, socket_type, protocol=0)
Parámetros:
- socket_family: AF_UNIX o AF_INET.
- socket_type: SOCK_STREAM o SOCK_DGRAM.
- protocol: Generalmente omitido (por defecto 0).
Una vez tienes el objeto socket, usa sus métodos para crear cliente o servidor.
Métodos de Socket Servidor
| Método | Descripción |
|---|---|
| s.bind() | Vincula dirección (hostname, puerto) al socket. |
| s.listen() | Configura e inicia listener TCP. |
| s.accept() | Acepta pasivamente conexión TCP cliente (bloqueante hasta que llega conexión). |
Métodos de Socket Cliente
| Método | Descripción |
|---|---|
| s.connect() | Inicia activamente conexión TCP servidor. |
Métodos Generales de Socket
| Método | Descripción |
|---|---|
| s.recv() | Recibe mensaje TCP. |
| s.send() | Transmite mensaje TCP. |
| s.recvfrom() | Recibe mensaje UDP. |
| s.sendto() | Transmite mensaje UDP. |
| s.close() | Cierra el socket. |
| socket.gethostname() | Retorna el nombre del host. |
Servidor Simple
Para escribir servidores de Internet, usa socket del módulo socket para crear objeto socket, luego configura el servidor.
#!/usr/bin/python
# server.py
import socket
s = socket.socket() # Crear objeto socket
host = socket.gethostname() # Obtener nombre máquina local
port = 12345 # Reservar puerto para servicio
s.bind((host, port)) # Vincular al puerto
s.listen(5) # Esperar conexión cliente
while True:
c, addr = s.accept() # Establecer conexión con cliente
print('Got connection from', addr)
c.send('Thank you for connecting')
c.close() # Cerrar conexión
Cliente Simple
Programa cliente simple que abre conexión a puerto 12345 y host dado.
#!/usr/bin/python # client.py import socket s = socket.socket() # Crear objeto socket host = socket.gethostname() # Obtener nombre máquina local port = 12345 # Puerto del servicio s.connect((host, port)) # Conectar al servidor print(s.recv(1024)) # Leer datos del socket s.close() # Cerrar socket
Ejecutar
# Iniciar servidor en background $ python server.py & # Ejecutar cliente $ python client.py
Resultado:
Got connection from ('127.0.0.1', 48437)
Thank you for connecting
Módulos de Internet en Python
Lista de módulos importantes para programación de red/Internet:
| Protocolo | Función Común | Puerto | Módulo Python |
|---|---|---|---|
| HTTP | Páginas web | 80 | httplib, urllib, xmlrpclib |
| NNTP | Noticias Usenet | 119 | nntplib |
| FTP | Transferencia de archivos | 20 | ftplib, urllib |
| SMTP | Envío de email | 25 | smtplib |
| POP3 | Recepción de email | 110 | poplib |
| IMAP4 | Recepción de email | 143 | imaplib |
| Telnet | Líneas de comando | 23 | telnetlib |
| Gopher | Transferencia de documentos | 70 | gopherlib, urllib |
Revisa las bibliotecas mencionadas para trabajar con FTP, SMTP, POP e IMAP.
Lecturas Adicionales
- Programación de Sockets Unix.
- Biblioteca y Módulos Socket de Python.
python
- Dominando tipos de datos en Python: Guía práctica
- Dominando operadores en Python: Guía completa
- Dominando la sentencia pass en Python: Guía práctica
- Dominando argumentos de funciones en Python: Posicionales, por palabra clave y por defecto
- Dominando Diccionarios en Python: Creación, Manipulación y Técnicas Avanzadas
- Dominando la Programación Orientada a Objetos en Python: Clases, Herencia, Encapsulación y Polimorfismo
- Dominando Iteradores en Python: Cómo Funcionan y Cómo Crear los Tuyos
- Explicación de Closures en Python: Cómo las Funciones Anidadas Capturan Variables
- Dominando datetime en Python: Guía Práctica de Fechas, Horas y Zonas Horarias
- Dominar time.sleep() en Python: Mejores Prácticas, Multihilo y Ejemplos Reales
- Programación Multihilo en Python: Técnicas Eficientes de Concurrencia