Programación básica de sockets en Python

    En general, los servicios de red siguen el modelo tradicional cliente / servidor. Una computadora actúa como servidor para proporcionar un determinado servicio y otra computadora representa el lado del cliente que hace uso de este servicio. Para comunicarse a través de la red toma de red entra en juego, en la mayoría de los casos solo se conoce como enchufe. Este tipo de comunicación de socket se puede incluso utilizar internamente en una computadora para comunicación entre procesos (IPC).

    Este artículo explica cómo escribir una aplicación cliente / servidor simple que se comunique a través de un conector de red utilizando el lenguaje de programación Python. Por simplicidad, nuestro servidor de ejemplo solo envía los datos recibidos a stdout. La idea detrás de la aplicación cliente / servidor es un sensor en una estación meteorológica, que recopila datos de temperatura a lo largo del tiempo y envía los datos recopilados a una aplicación servidor, donde los datos se procesan más.

    ¿Qué es un enchufe?

    Un socket de red es un punto final de un enlace de comunicación bidireccional entre dos programas o procesos, cliente y servidor en nuestro caso, que se ejecutan en la red. Esto puede estar en la misma computadora, así como en diferentes sistemas que están conectados a través de la red.

    Ambas partes se comunican entre sí escribiendo o leyendo desde el conector de red. El equivalente técnico en realidad es una comunicación telefónica entre dos participantes. La toma de red representa el número correspondiente de la línea telefónica, o un contrato en el caso de los teléfonos móviles.

    Ejemplo

    Para hacer uso de la funcionalidad de socket, solo Python módulo de enchufe es necesario. En el código de ejemplo que se muestra a continuación, Python módulo de tiempo también se importa para simular la estación meteorológica y simplificar los cálculos de tiempo.

    En este caso, tanto el cliente como el servidor se ejecutan en la misma computadora. Un socket tiene un número de puerto correspondiente, que es 23456 en nuestro caso. Si lo desea, puede elegir un número de puerto diferente del rango de números no restringidos entre 1024 y 65535.

    El servidor

    Habiendo cargado el Python adicional socket módulo se crea un conector de transmisión de Internet utilizando el socket.socket clase con los dos parámetros socket.AF_INET y socket.SOCK_STREAM. La recuperación del nombre de host, el nombre de dominio completo y la dirección IP se realiza mediante los métodos gethostname(), getfqdn()y gethostbyname(), respectivamente. A continuación, el socket está vinculado a la dirección IP y al número de puerto 23456 con la ayuda del bind() método.

    Con la ayuda del listen() método el servidor escucha las conexiones entrantes en el puerto especificado. En el ciclo while, el servidor espera las solicitudes entrantes y las acepta mediante el accept() método. Los datos enviados por el cliente se leen a través de recv() método como fragmentos de 64 bytes, y simplemente se envía a stdout. Finalmente, la conexión actual se cierra si el cliente no envía más datos.

    # load additional Python module
    import socket
    
    # create TCP/IP socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # retrieve local hostname
    local_hostname = socket.gethostname()
    
    # get fully qualified hostname
    local_fqdn = socket.getfqdn()
    
    # get the according IP address
    ip_address = socket.gethostbyname(local_hostname)
    
    # output hostname, domain name and IP address
    print ("working on %s (%s) with %s" % (local_hostname, local_fqdn, ip_address))
    
    # bind the socket to the port 23456
    server_address = (ip_address, 23456)
    print ('starting up on %s port %s' % server_address)
    sock.bind(server_address)
    
    # listen for incoming connections (server mode) with one connection at a time
    sock.listen(1)
    
    while True:
        # wait for a connection
        print ('waiting for a connection')
        connection, client_address = sock.accept()
    
        try:
            # show who connected to us
            print ('connection from', client_address)
    
            # receive the data in small chunks and print it
            while True:
                data = connection.recv(64)
                if data:
                    # output received data
                    print ("Data: %s" % data)
                else:
                    # no more data -- quit the loop
                    print ("no more data.")
                    break
        finally:
            # Clean up the connection
            connection.close()
    

    El cliente

    Ahora veremos el lado del cliente. El código Python es mayormente similar al del lado del servidor, excepto por el uso del socket – el cliente usa el connect() método, en su lugar. en un for bucle los datos de temperatura se envían al servidor mediante el sendall() método. La llamada del time.sleep(2) El método detiene al cliente durante dos segundos antes de enviar otra lectura de temperatura. Después de enviar todos los datos de temperatura de la lista, la conexión finalmente se cierra utilizando el close() método.

    # load additional Python modules
    import socket
    import time
    
    # create TCP/IP socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    # retrieve local hostname
    local_hostname = socket.gethostname()
    
    # get fully qualified hostname
    local_fqdn = socket.getfqdn()
    
    # get the according IP address
    ip_address = socket.gethostbyname(local_hostname)
    
    # bind the socket to the port 23456, and connect
    server_address = (ip_address, 23456)
    sock.connect(server_address)
    print ("connecting to %s (%s) with %s" % (local_hostname, local_fqdn, ip_address))
    
    # define example data to be sent to the server
    temperature_data = ["15", "22", "21", "26", "25", "19"]
    for entry in temperature_data:
        print ("data: %s" % entry)
        new_data = str("temperature: %sn" % entry).encode("utf-8")
        sock.sendall(new_data)
        
        # wait for two seconds
        time.sleep(2)
    
    # close connection
    sock.close()
    

    Ejecución del servidor y el cliente

    Para ejecutar tanto el servidor como el programa cliente, abra dos Windows de terminal y emita los siguientes comandos: uno por ventana de terminal y en el siguiente orden:

    $ python3 echo-server.py
    

    y

    $ python3 echo-client.py
    

    Las dos figuras siguientes muestran la salida correspondiente del programa de ejemplo:

    _Figura 1_ _Figura 2_

    Conclusión

    Escribir programas Python que usan IPC con sockets es bastante simple. El ejemplo anterior ciertamente puede extenderse para manejar algo más complejo. Para obtener más información y métodos adicionales, puede echar un vistazo a algunos Recursos de programación de socket de Python disponible.

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *