Para transmitir y recibir información usando sockets, es importante entender cómo funcionan los métodos básicos para el envío y recepción de datos. A continuación, te muestro un ejemplo más avanzado que implementa una comunicación bidireccional entre un servidor y un cliente, utilizando send
y recv
en un bucle continuo.
El servidor puede aceptar múltiples mensajes de un cliente, responder a cada uno y finalizar la conexión cuando el cliente envía una palabra clave específica (por ejemplo, salir
).
import socket
# Crear el socket del servidor
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Configurar dirección y puerto
host = 'localhost'
port = 12345
server_socket.bind((host, port))
# Escuchar conexiones entrantes
server_socket.listen(1)
print(f"Servidor escuchando en {host}:{port}...")
# Aceptar conexión
conn, addr = server_socket.accept()
print(f"Conexión establecida con {addr}")
while True:
# Recibir datos del cliente
data = conn.recv(1024).decode() # Decodificar los datos recibidos
if not data:
break
print(f"Cliente dice: {data}")
# Finalizar la conexión si el cliente envía 'salir'
if data.lower() == 'salir':
print("El cliente ha finalizado la conexión.")
conn.send("Conexión cerrada. ¡Adiós!".encode())
break
# Responder al cliente
response = f"Servidor recibió: {data}"
conn.send(response.encode()) # Enviar respuesta al cliente
# Cerrar conexión
conn.close()
print("Conexión cerrada.")
El cliente se conecta al servidor y permite al usuario enviar mensajes. Recibe respuestas del servidor y finaliza la conexión al enviar salir
.
import socket
# Crear el socket del cliente
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Conectar al servidor
host = 'localhost'
port = 12345
client_socket.connect((host, port))
print(f"Conectado al servidor en {host}:{port}")
while True:
# Pedir entrada al usuario
message = input("Tú: ")
client_socket.send(message.encode()) # Enviar mensaje al servidor
# Finalizar la conexión si el usuario envía 'salir'
if message.lower() == 'salir':
print("Has finalizado la conexión.")
break
# Recibir respuesta del servidor
data = client_socket.recv(1024).decode()
print(f"Servidor dice: {data}")
# Cerrar conexión
client_socket.close()
print("Conexión cerrada.")
servidor.py
.cliente.py
.python servidor.py
python cliente.py
Conexión:
bind
y listen
).connect
).Transmisión de Datos:
send
para enviar datos y recv
para recibirlos.encode
y decode
para convertir entre cadenas de texto y bytes.Comunicación Bidireccional:
salir
para terminar la comunicación.asyncio
para manejar varios clientes simultáneamente.