Enunciado y solución de ejercicios resueltos en Python: socket. Se incluye la descarga del código fuente completo de los ejercicios en Python. Se desarrollarán dos programas Python, un cliente y un servidor, para envío de mensajes por sockets entre ambos.
Ejercicio resuelto Python: socket
Enunciado del ejercicio Python
Realizar un script Python que cree envíe mensajes por socket (cliente). Y otro script para recibir mensajes por sockets (servidor).
Tanto el servidor como el cliente quedarán a la escucha de recepción de mensajes (por sockets). El servidor estará ubicado en el mismo equipo que el cliente (localhost o 127.0.0.1). Por lo tanto, el servidor realizará la escucha por localhost y el puerto 8089.
La funcionalidad pedida para cliente y servidor:
- El servidor mostrará por pantalla los datos del cliente conectado (IP y puerto), con el formato:
- Conexión al servidor desde cliente: IP y PUERTO.
- El servidor mostrará por pantalla el mensaje de texto recibido del cliente, con el formato:
- Mensaje recibido: MENSAJE.
- El servidor enviará un mensaje al cliente, con el formato:
- Mensaje recibido en el servidor del cliente IP y PUERTO.
- Desde el cliente, se le pedirá al usuario que introduzca un mensaje. El mensaje introducido se enviará por socket al servidor.
- El cliente debe mostrar por pantalla el mensaje recibido desde el servidor, con el formato:
- Mensaje recibido del servidor: MENSAJE.
Para el desarrollo de este ejercicio, en el servidor, únicamente se permitirá una conexión de un único cliente concurrentemente.
Cuando el usuario introduzca «q» en el mensaje desde el cliente, se cerrará la conexión tanto en servidor como en el cliente.
Solución del ejercicio en Python
La solución propuesta al ejercicio 1, como ejemplo de uso de sockets en Python, podría ser:
Para el script Python del servidor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import socket def Main(): servidor = "localhost" puerto = 8089 # Definimos el objeto socket obSocket = socket.socket() # Preparamos la conexión obSocket.bind((servidor, puerto)) # Establecemos el número máximo de conexiones permitidas: 1 obSocket.listen(1) print("Servidor iniciado, queda a la escucha de conexiones de clientes...") # Dejamos el servidor escuchando peticiones de clientes conexion, cliente = obSocket.accept() # Cuando un cliente se conecte, mostramos su IP print(f"Conexión al sevidor desde cliente: {str(cliente)}") # Dejamos la aplicación servidor ejecutándose hasta que se reciba la conexión de un cliente y su mensaje while True: # Decodificamos los datos recibidos del cliente datosRecibidos = conexion.recv(1024).decode() # Si no se han recibido datos, cerramos el servidor # if not datosRecibidos: # break if datosRecibidos.upper() == "Q": break # Mostramos por consola el mensaje enviado del cliente al servidor print(f"Mensaje recibido: {str(datosRecibidos)}") # Enviamos al cliente otro mensaje para que sepa que se ha recibido conexion.send(f"Mensaje recibido en el servidor del cliente IP {cliente}".encode()) # Cerramos la conexión del servidor para liberar el uso del puerto conexion.close if __name__ == "__main__": Main() |
Para el script Python del cliente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import socket def Main(): # Dirección IP o nombre DNS del servidor servidor = "localhost" # Puerto de conexión por socket al servidor puerto = 8089 # Definimos el objeto socket obSocket = socket.socket() # Preparamos la conexión obSocket.connect((servidor, puerto)) textoUsuario = "Introduzca un mensaje para enviar al servidor (introduce 'q' para salir): " mensaje = input(textoUsuario) # Mientras no se introduzca "q" pediremos al usuario que introduzca mensajes while mensaje.upper() != "Q": # Codificamos el mensaje y lo enviamos por socket al servidor obSocket.send(mensaje.encode()) # Recibimos un posible mensaje desde el servidor datosRecibidos = obSocket.recv(1024).decode() # Mostramos el mensaje recibido desde el servidor print(f"Mensaje recibido del servidor: {str(datosRecibidos)}") # Volvemos a pedir al usuario que introduzca un mensaje mensaje = input(textoUsuario) # Cerramos la conexión obSocket.close() if __name__ == "__main__": Main() |
Ejemplo de ejecución del ejercicio en Python
La compilación del ejercicio 1, por la parte del servidor, quedará a la escucha, mostrando el mensaje:
Servidor iniciado, queda a la escucha de conexiones de clientes…
Por la parte del cliente, enviando un mensaje al servidor por sockets:
Introduzca un mensaje para enviar al servidor (introduce ‘q’ para salir): Hola, prueba envío mensaje
Mensaje recibido del servidor: Mensaje recibido en el servidor del cliente IP (‘127.0.0.1’, 49201)
Introduzca un mensaje para enviar al servidor (introduce ‘q’ para salir):
Y el servidor, mostrando el resultado de la recepción del mensaje desde el cliente y del envío de mensaje al cliente, así como el cierre del programa si se pulsa «q»:
Y el cliente, nuevamente, con la recepción del mensaje del servidor y el cierre del cliente cuando se pulsa «q»:
Descarga del fichero Python con el ejercicio resuelto
En el siguiente enlace os proporcionamos la descarga del código fuente completo en Python con la solución del ejercicio propuesto: