Programación de sockets en Python – Ejemplo de servidor y cliente

¡Buen día, aprendices! En nuestro tutorial anterior, discutimos sobre el módulo Python unittest. Hoy echaremos un vistazo al ejemplo de programación de sockets en Python. Crearemos aplicaciones de servidor y cliente de sockets en Python.

Programación de Sockets en Python

Para entender la programación de sockets en Python, necesitamos conocer tres temas interesantes: Servidor de Socket, Cliente de Socket y Socket. Entonces, ¿qué es un servidor? Bueno, un servidor es un software que espera solicitudes de clientes y las sirve o las procesa según corresponda. Por otro lado, un cliente es el solicitante de este servicio. Un programa cliente solicita algunos recursos al servidor y el servidor responde a esa solicitud. El socket es el punto final de un canal de comunicaciones bidireccional entre el servidor y el cliente. Los sockets pueden comunicarse dentro de un proceso, entre procesos en la misma máquina o entre procesos en máquinas diferentes. Para cualquier comunicación con un programa remoto, tenemos que conectarnos a través de un puerto de socket. El objetivo principal de este tutorial de programación de sockets es presentarte cómo se comunican el servidor y el cliente de socket. También aprenderás cómo escribir un programa de servidor de socket en Python.

Ejemplo de Socket en Python

Anteriormente hemos mencionado que un cliente de socket solicita algunos recursos al servidor de socket y el servidor responde a esa solicitud. Por lo tanto, diseñaremos tanto el servidor como el modelo de cliente para que cada uno pueda comunicarse con ellos. Los pasos se pueden considerar de la siguiente manera.

  1. El programa del servidor de socket en Python se ejecuta primero y espera cualquier solicitud.
  2. El programa del cliente de socket en Python iniciará la conversación primero.
  3. Luego, el programa del servidor responderá según las solicitudes del cliente.
  4. El programa del cliente terminará si el usuario ingresa el mensaje “bye”. El programa del servidor también terminará cuando el programa del cliente finalice, esto es opcional y podemos mantener el programa del servidor en ejecución indefinidamente o terminarlo con algún comando específico en la solicitud del cliente.

Servidor de Socket en Python

Guardaremos el programa del servidor de sockets de Python como socket_server.py. Para usar la conexión de sockets de Python, necesitamos importar el módulo socket. Luego, secuencialmente, necesitamos realizar algunas tareas para establecer la conexión entre el servidor y el cliente. Podemos obtener la dirección del host usando la función socket.gethostname(). Se recomienda usar una dirección de puerto por encima de 1024 porque los números de puerto menores que 1024 están reservados para el protocolo estándar de Internet. Vea el siguiente ejemplo de código del servidor de sockets de Python, los comentarios le ayudarán a entender el código.

import socket


def server_program():
    # obtener el nombre del host
    host = socket.gethostname()
    port = 5000  # initiate port no above 1024

    server_socket = socket.socket()  # get instance
    # observa de cerca. La función bind() toma una tupla como argumento
    server_socket.bind((host, port))  # bind host address and port together

    # configurar cuántos clientes puede escuchar el servidor simultáneamente
    server_socket.listen(2)
    conn, address = server_socket.accept()  # accept new connection
    print("Connection from: " + str(address))
    while True:
        # recibir flujo de datos. No aceptará paquetes de datos mayores de 1024 bytes
        data = conn.recv(1024).decode()
        if not data:
            # si no se recibe ningún dato, salir
            break
        print("from connected user: " + str(data))
        data = input(' -> ')
        conn.send(data.encode())  # send data to the client

    conn.close()  # close the connection


if __name__ == '__main__':
    server_program()

Entonces, nuestro servidor de sockets de Python se está ejecutando en el puerto 5000 y esperará la solicitud del cliente. Si desea que el servidor no se cierre cuando se cierre la conexión del cliente, simplemente elimine la condición if y la declaración de ruptura. El bucle while de Python se utiliza para ejecutar el programa del servidor indefinidamente y seguir esperando la solicitud del cliente.

Cliente de Socket de Python

Guardaremos el programa cliente de socket de Python como socket_client.py. Este programa es similar al programa servidor, excepto en la vinculación. La diferencia principal entre el programa servidor y el programa cliente es que, en el programa servidor, es necesario vincular la dirección del host y el puerto juntos. Vea el siguiente código de ejemplo del cliente de socket de Python, el comentario le ayudará a entender el código.

import socket


def client_program():
    host = socket.gethostname()  # as both code is running on same pc
    port = 5000  # socket server port number

    client_socket = socket.socket()  # instantiate
    client_socket.connect((host, port))  # connect to the server

    message = input(" -> ")  # take input

    while message.lower().strip() != 'bye':
        client_socket.send(message.encode())  # send message
        data = client_socket.recv(1024).decode()  # receive response

        print('Received from server: ' + data)  # show in terminal

        message = input(" -> ")  # again take input

    client_socket.close()  # close the connection


if __name__ == '__main__':
    client_program()

Salida de Programación de Socket de Python

Para ver la salida, primero ejecute el programa servidor de socket. Luego ejecute el programa cliente de socket. Después de eso, escriba algo desde el programa cliente. Luego vuelva a escribir la respuesta desde el programa servidor. Por último, escriba bye desde el programa cliente para terminar ambos programas. El siguiente video corto mostrará cómo funcionó en mi prueba del programa de ejemplo de servidor y cliente de socket.

pankaj$ python3.6 socket_server.py 
Connection from: ('127.0.0.1', 57822)
from connected user: Hi
 -> Hello
from connected user: How are you?
 -> Good
from connected user: Awesome!
 -> Ok then, bye!
pankaj$
pankaj$ python3.6 socket_client.py 
 -> Hi
Received from server: Hello
 -> How are you?
Received from server: Good
 -> Awesome!
Received from server: Ok then, bye!
 -> Bye
pankaj$

Observe que el servidor de socket se está ejecutando en el puerto 5000 pero el cliente también requiere un puerto de socket para conectarse al servidor. Este puerto es asignado aleatoriamente por la llamada de conexión del cliente. En este caso, es 57822. Así que eso es todo para la programación de socket en Python, programas de ejemplo de servidor y cliente de socket en Python. Referencia: Documentación Oficial

Source:
https://www.digitalocean.com/community/tutorials/python-socket-programming-server-client