Programación básica de sockets en Python

P

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.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad