En este tutorial, aprenderá cómo intercambiar datos entre un cliente y un servidor mediante la programación de socket de Python y la API de socket. Más adelante, este tutorial analizará el intercambio de datos directamente entre dos o más clientes de Python mediante un proveedor alojado. El código fuente utilizado en este tutorial se puede encontrar en el repositorio de GitHub .
La programación de sockets conecta dos sockets (un socket de cliente y un socket de servidor) y les permite comunicarse bidireccionalmente en tiempo real. Las conexiones directas de socket pueden beneficiar a todas las aplicaciones en tiempo real, ya que los datos se pueden enviar o recibir en cualquier momento.
Necesitará una versión estable de Python versión 3.x instalada en su máquina. Si es usuario de Windows, tiene la opción de agregar Python a su RUTA.
También necesitará un editor de código para seguir este tutorial.
Visual Studio Code es un popular editor de código gratuito y de código abierto que admite muchos lenguajes y marcos, incluido Python.
VSCode también admite extensiones para Python para ayudar a completar y depurar el código.
Construyamos una aplicación de socket sencilla usando Python. Python proporciona una clase de socket nativa (módulo de socket), por lo que los desarrolladores no necesitan depender de bibliotecas externas. Comience por configurar el servidor y el cliente de socket de Python:
Cree el archivo client.py
en el directorio del proyecto. Para usar sockets, importe la biblioteca de sockets de Python y cree un nuevo objeto de socket que se conecte a una dirección IP específica (en este caso, localhost en el número de puerto 8080, pero puede seleccionar cualquier dirección ipv4).
Cree una nueva conexión con el servidor de socket, envíe datos al servidor TCP y cierre la conexión de socket.
Su archivo client.py
debería verse así:
import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('0.0.0.0', 8080)) client.send("I am CLIENT\n".encode()) from_server = client.recv(4096) client.close() print (from_server.decode())
Necesitará un servidor de socket para escuchar las conexiones entrantes y los mensajes de su cliente.
Cree el archivo server.py
y agregue los siguientes contenidos:
import socket serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serv.bind(('0.0.0.0', 8080)) serv.listen(5) while True: conn, addr = serv.accept() from_client = '' while True: data = conn.recv(4096) if not data: break from_client += data.decode('utf8') print (from_client) conn.send("I am SERVER\n".encode()) conn.close() print ('client disconnected and shutdown')
Server.py
vincula el objeto de socket al nombre de host (localhost) en el puerto 8080 y escucha continuamente nuevas conexiones de clientes. Cuando un cliente se conecta a esta dirección, el servidor acepta la conexión y lee los datos.
Una vez que los datos se leen con éxito del cliente, el servidor proporciona una respuesta de datos, momento en el que el cliente finaliza la conexión.
Para probar esto usted mismo, abra dos ventanas de terminal simultáneamente. En una ventana, ejecute:
python3 server.py
En la segunda ventana, ejecuta:
python3 client.py
Tenga en cuenta que el servidor continúa ejecutándose y establecerá una nueva conexión cada vez que ejecute el cliente y agregue cualquier resultado nuevo.
El cliente enviará la cadena "Soy CLIENTE" al servidor y esperará una respuesta. El servidor leerá el mensaje del cliente, lo enviará a la terminal y enviará una respuesta al cliente.
Hasta ahora, este tutorial ha cubierto el intercambio de mensajes entre un servidor y un cliente, pero ¿qué sucede si necesita comunicarse directamente entre los clientes de Python?
Enviar datos directamente entre dos o más dispositivos cliente es complicado porque se enfrenta a muchas consideraciones de escala y seguridad a medida que aumenta la cantidad de dispositivos.
Se utiliza una arquitectura cliente-servidor para moderar y gestionar su comunicación cliente-cliente. Si no tiene un servidor web o le preocupa que su servidor se amplíe para satisfacer las demandas de su aplicación, debe optar por una solución de comunicación alojada en tiempo real como PubNub .
Los SDK multiplataforma de PubNub, incluido Python , pueden identificar a los usuarios y enviar mensajes a canales específicos, que solo recibirán los clientes suscritos.
Entonces, ¿cómo se escribiría la aplicación simple presentada anteriormente con PubNub para intercambiar mensajes directamente entre dos clientes? Es esencial entender que aunque PubNub usa la arquitectura de 'publicación' y 'suscripción' (pub/sub) para enviar y recibir mensajes bidireccionales entre puntos finales, todavía usa sockets en segundo plano. PubNub le brinda los beneficios de la comunicación de socket sin preocuparse por los detalles de la programación de la red de Python y manteniendo una conexión permanente entre sus clientes, independientemente del sistema operativo.
Para integrar PubNub en el proyecto, instale el paquete PubNub con pip en la terminal; esto le permitirá usar el SDK de Python de PubNub y comunicarse con la infraestructura de PubNub.
pip3 install 'pubnub>=7.1.0'
Deberá crear dos clientes para conectarse y comunicarse a través de la red PubNub. Cree un archivo pn_client_1.py
y agregue el siguiente código:
from pubnub.callbacks import SubscribeCallback from pubnub.enums import PNStatusCategory from pubnub.pnconfiguration import PNConfiguration from pubnub.pubnub import PubNub import time import os pnconfig = PNConfiguration() userId = os.path.basename(__file__) pnconfig.publish_key = 'demo' pnconfig.subscribe_key = 'demo' pnconfig.user_id = userId pnconfig.ssl = True pubnub = PubNub(pnconfig) def my_publish_callback(envelope, status): # Check whether request successfully completed or not if not status.is_error(): pass class MySubscribeCallback(SubscribeCallback): def presence(self, pubnub, presence): pass def status(self, pubnub, status): pass def message(self, pubnub, message): if message.publisher == userId : return print ("from device " + message.publisher + ": " + message.message) pubnub.add_listener(MySubscribeCallback()) pubnub.subscribe().channels("chan-1").execute() ## publish a message while True: msg = input("") if msg == 'exit': os._exit(1) pubnub.publish().channel("chan-1").message(str(msg)).pn_async(my_publish_callback)
Cree el archivo pn_client_2.py
y agregue el mismo código que usó para pn_client_1.py
El código anterior usa claves 'de demostración', pero puede obtener sus claves PubNub personalizadas de forma gratuita.
Ejecute pn_client_1.py
y pn_client_2.py
simultáneamente en dos ventanas de terminal diferentes
python3 pn_client_1.py
python3 pn_client_2.py
Cada cliente inicializa su conexión a la red PubNub y se suscribe para recibir nuevos mensajes cada vez que se publican en el canal chan-1
. Puede pensar en esto como enviar datos a través de un socket TCP en Python; Detrás de escena, PubNub está creando y administrando el socket por usted y enrutando su mensaje a todos los clientes que lo están escuchando. Una vez que el cliente remoto recibe el mensaje, el mensaje recibido se muestra en la línea de comando.
¡Y eso es todo! Para obtener más información sobre el desarrollo con PubNub, consulte nuestra gama de tutoriales . Alternativamente, consulte el recorrido interactivo en vivo de PubNub para comprender cómo la plataforma proporciona interactividad en tiempo real a las aplicaciones. PubNub es compatible con la comunicación de datagramas TCP y UDP, así como con Linux, Unix y Windows.
También publicado aquí: https://www.pubnub.com/blog/socket-programming-in-python-client-server-p2p/