Conexión TCP
El modelo TCP en Python implica sockets orientados a conexión. A continuación se describen los pasos esenciales para implementar un servidor y un cliente.
Servidor TCP
El flujo típico para un servidor TCP incluye:
- Crear un socket con tipo de red (por ejemplo, IPv4) y modo de transmisión (TCP).
- Vincular el socket a una dirección y puerto específicos para permitir conexiones entrantes.
- Configurar una cola de escucha para gestionar solicitudes de conexión.
- Ejecutar un bucle continuo donde se aceptan nuevas conexiones, devolviendo un socket exclusivo para cada cliente. La lógica de comunicación se maneja en funciones separadas para posibilitar concurrencia.
- Realizar operaciones de lectura y escritura mediante los métodos de envío y recepción del socket.
Ejemplo de código para el servidor TCP:
import socket
def ejecutar_servidor_tcp():
socket_escucha = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_escucha.bind(('0.0.0.0', 8080))
socket_escucha.listen(4)
while True:
socket_conexion, (direccion_remota, puerto_remoto) = socket_escucha.accept()
print(f"Conexión establecida desde {direccion_remota}:{puerto_remoto}")
# Implementar lógica de intercambio de datos aquí
socket_conexion.close()
if __name__ == "__main__":
ejecutar_servidor_tcp()
Cleinte TCP
Para un cliente TCP, los pasos son:
- Inicializar un socket TCP.
- Conectar el socket al servidor mediante la dirección y puerto.
- Intercambiar datos a través del socket conectado.
Ejemplo de código para el cliente TCP:
import socket
def ejecutar_cliente_tcp():
socket_cliente = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_cliente.connect(('localhost', 8080))
# Ejemplo de envío y recepción de datos
# socket_cliente.sendall(b"Hola servidor")
# respuesta = socket_cliente.recv(1024)
# print(respuesta.decode())
socket_cliente.close()
if __name__ == "__main__":
ejecutar_cliente_tcp()
Conexión UDP
UDP es un protocolo sin conexión, simplificando la transmisión al omitir mecanismos como el handshake y la retransmisión de errores. Esto lo hace más veloz, adecuado para aplicaciones como transmisión de audio o video donde la latencia es crítica y la pérdida ocasionla de paquetes es aceptable.
Servidor UDP
Los pasos para un servidor UDP son:
- Crear un socket de datagramas (UDP).
- Enlazar el socket a un puerto para recibir paquetes.
- Permanecer en espera de datagramas entrantes.
Ejemplo de código para el servidor UDP:
import socket
def iniciar_servidor_udp():
direccion_servidor = ('0.0.0.0', 8080)
socket_recepcion = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_recepcion.bind(direccion_servidor)
while True:
datos, direccion_cliente = socket_recepcion.recvfrom(2048)
print(f"Datos recibidos de {direccion_cliente}: {datos.decode()}")
if __name__ == "__main__":
iniciar_servidor_udp()
En el servidor, la dirección vacía ('') indica que se aceptan paquetes de cualquier origen.
Cliente UDP
El cliente UDP solo necesita crear un socket y enviar o recibir datos:
- Instanciar un socket UDP.
- Enviar datagramas a una dirección y puerto específicos.
- Opcionalmente, recibir respuestas si es necesario.
Ejemplo de código para el cliente UDP:
import socket
def ejecutar_cliente_udp():
direccion_destino = ('localhost', 8080)
socket_envio = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
mensaje = b"Paquete UDP de prueba"
socket_envio.sendto(mensaje, direccion_destino)
socket_envio.close()
if __name__ == "__main__":
ejecutar_cliente_udp()