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 *