¿Qué es la programación de sockets en Python y cómo dominarla?



Aprenda qué es la programación de sockets en Python junto con las comunicaciones cliente-servidor junto con la transferencia de objetos de Python usando pickle y sockets.

Sin lugar a dudas, Internet se ha convertido en el 'alma de la existencia' y su actividad se caracteriza por 'conexiones' o 'redes'. Estas redes son posibles utilizando uno de los fundamentos más cruciales de Zócalos. Este artículo cubre todas las áreas relacionadas con la programación de sockets en Python. Los enchufes le ayudan a realizar estas conexiones, mientras , sin duda, lo pone fácil.

Echemos un vistazo rápido a todos los temas cubiertos en este artículo:





¿Por qué utilizar Sockets?
¿Qué son los sockets en Python?
Cómo lograr la programación de sockets en Python
¿Qué es un servidor?
¿Qué es un cliente?
Echo Cliente-Servidor
Comunicaciones múltiples
Transferir objetos de Python



¿Por qué utilizar Sockets?

Los sockets son la columna vertebral de las redes. Hacen posible la transferencia de información entre dos programas o dispositivos diferentes. Por ejemplo, cuando abre su navegador, usted como cliente está creando una conexión con el servidor para la transferencia de información.

Antes de profundizar en esta comunicación, primero averigüemos qué son exactamente estos enchufes.

¿Qué son los enchufes?

En términos generales, los sockets son puntos finales interiores creados para enviar y recibir datos. Una sola red tendrá dos enchufes, uno para cada dispositivo o programa de comunicación. Estos sockets son una combinación de una dirección IP y un puerto. Un solo dispositivo puede tener 'n' números de sockets según el número de puerto que se esté utilizando. Hay diferentes puertos disponibles para diferentes tipos de protocolos. Eche un vistazo a la siguiente imagen para obtener más información sobre algunos de los números de puerto comunes y los protocolos relacionados:




Puertos comunes-Programación de sockets en Python-Edureka

Ahora que tiene claro el concepto de sockets, echemos un vistazo al módulo Socket de Python:

Cómo lograr la programación de sockets en Python:

Para lograr la programación de socket en Python, deberá importar el enchufe módulo o . Este módulo consta de métodos integrados que son necesarios para crear sockets y ayudarlos a asociarse entre sí.

Algunos de los métodos importantes son los siguientes:

MétodosDescripción

socket.socket ()

utilizado para crear sockets (requerido tanto en el servidor como en los extremos del cliente para crear sockets)

socket.accept ()

utilizado para aceptar una conexión. Devuelve un par de valores (conn, dirección) donde conn es un nuevo objeto de socket para enviar o recibir datos y la dirección es la dirección del socket presente en el otro extremo de la conexión.

socket.bind ()

se utiliza para enlazar con la dirección que se especifica como parámetro

socket.close ()

utilizado para marcar el enchufe como cerrado

socket.connect ()

utilizado para conectarse a una dirección remota especificada como el parámetro

socket.listen ()

permite que el servidor acepte conexiones

Ahora que ha entendido la importancia del módulo de socket, pasemos a ver cómo puede servir para crear servidores y clientes para la programación de sockets en .

¿Qué es un servidor?

Un servidor es un programa, una computadora o un dispositivo que se dedica a administrar los recursos de la red. Los servidores pueden estar en el mismo dispositivo o computadora o conectados localmente a otros dispositivos y computadoras o incluso de forma remota. Existen varios tipos de servidores, como servidores de bases de datos, servidores de red, servidores de impresión, etc.

Los servidores suelen hacer uso de métodos como socket.socket (), socket.bind (), socket.listen (), etc. para establecer una conexión y enlazarse con los clientes. Ahora, escriba un programa para crear un servidor. Considere el siguiente ejemplo:

EJEMPLO:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 1234)) # el número de puerto puede ser cualquier valor entre 0-65535 (normalmente especificamos puertos no privilegiados que son > 1023) s.listen (5) while True: clt, adr = s.accept () print (f'Conexión a {adr} establecido ') #f cadena es una cadena literal con el prefijo f que #contiene expresiones de Python entre llaves clt .send (bytes ('Programación de socket en Python', 'utf-8')) # para enviar información a clientsocket

Como puede ver, la primera necesidad para crear un socket es importar el módulo de socket. Después de eso, se usa el método socket.socket () para crear un socket del lado del servidor.

NOTA:

AF_INET se refiere a la dirección de Internet y requiere un par de (host, puerto) donde el host puede ser una URL de algún sitio web en particular o su dirección y el número de puerto es un número entero. SOCK_STREAM se utiliza para crear protocolos TCP.

El método bind () acepta dos parámetros como una tupla (host, puerto). Sin embargo, es mejor utilizar números de puerto de 4 dígitos, ya que los inferiores suelen estar ocupados. El método listen () permite al servidor aceptar conexiones. Aquí, 5 es la cola para múltiples conexiones que surgen simultáneamente. El valor mínimo que se puede especificar aquí es 0 (si da un valor menor, se cambia a 0). En caso de que no se especifique ningún parámetro, toma uno adecuado por defecto.

los permite aceptar conexiones para siempre. 'Clt' y 'adr' son el objeto y la dirección del cliente. La declaración de impresión simplemente imprime la dirección y el número de puerto del socket del cliente. Finalmente, clt.send se usa para enviar los datos en bytes.

Ahora que nuestro servidor está listo, avancemos hacia el cliente.

¿Qué es un cliente?

Un cliente es una computadora o software que recibe información o servicios del servidor. En un módulo cliente-servidor, los clientes solicitan servicios de los servidores. El mejor ejemplo es un navegador web como Google Chrome, Firefox, etc. Estos navegadores web solicitan servidores web para las páginas web y los servicios requeridos según las indicaciones del usuario. Otros ejemplos incluyen juegos en línea, chats en línea, etc.

Ahora echemos un vistazo a cómo codificar el programa del lado del cliente en :

EJEMPLO:

import socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) msg ​​= s.recv (1024) print (msg.decode ('utf-8') )

El primer paso es importar el módulo de socket y luego crear un socket tal como lo hizo al crear un servidor. Luego, para crear una conexión entre el cliente-servidor, necesitará usar el método connect () especificando (host, puerto).


NOTA: gethostname se usa cuando el cliente y el servidor están en la misma computadora. (LAN - localip / WAN - publicip)

asignación de memoria dinámica en c ++ con programa de ejemplo

Aquí, el cliente quiere recibir información del servidor y para ello necesita utilizar el método recv () y la información se almacena en otra variable msg. Solo tenga en cuenta que la información que se pasa estará en bytes y en el cliente en el programa anterior puede recibir hasta 1024 bytes (tamaño de búfer) en una sola transferencia. Se puede especificar a cualquier cantidad dependiendo de la cantidad de información que se transfiera.

Finalmente, el mensaje que se transfiere debe decodificarse e imprimirse.

Ahora que sabe cómo crear programas cliente-servidor, pasemos a ver cómo deben ejecutarse.

Echo Cliente-Servidor:

Para ejecutar estos programas, abra su símbolo del sistema, ingrese a la carpeta donde ha creado su programa cliente y servidor y luego escriba:

py server.py (aquí, server.py es el nombre de archivo del servidor, también puede usar py -3.7 server.py)

Una vez hecho esto, el servidor comienza a funcionar. Para ejecutar el cliente, abra otra ventana de cmd y escriba:

py client.py (aquí, client.py es el nombre de archivo del cliente)

SALIDA (SERVIDOR):

(CLIENTE)

Probemos el mismo programa reduciendo el tamaño del búfer a 7 y veamos qué resultado obtenemos:

SALIDA:

Como puede ver, la conexión finaliza después de transferir 7 bytes. Pero esto es un problema porque no ha recibido la información completa y la conexión está cerrada. Continuemos para resolver este problema.

Comunicaciones múltiples:

Para que la conexión continúe hasta que el cliente reciba la información completa, puede hacer uso del ciclo while:

EJEMPLO:

importar socket s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2346)) while True: msg = s.recv (7) print (msg.decode ('utf- 8 '))

Una vez que haga esto, el mensaje completo se recibirá en 7 bytes por transferencia.

Pero esta vez, como puede ver, la conexión no se interrumpe y nunca se sabe cuándo sucederá. Y para agregar a esto, ¿qué pasa si realmente no sabe qué tan grande es el mensaje o la información que el cliente recibirá del servidor? En tales casos, puede usar el siguiente código en el lado del cliente:

EJEMPLO:

complete_info = '' while True: msg = s.recv (7) if len (msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

En el lado del servidor, use el método close () de la siguiente manera:

clt.close ()

El resultado de esto será como se muestra en la siguiente imagen:

SALIDA:



Todo lo que hace el bloque de código anterior es verificar el tamaño de la información e imprimirla en un búfer de dos bytes a la vez y cerrar la conexión después de que se haya completado.

Transferencia de objetos de Python:

Hasta aquí, acabas de tener la habilidad de transferir cadenas. Pero, la programación de socket en Pitón también le permite transferir objetos Python. Estos objetos pueden ser conjuntos, tuplas, diccionarios, etc. Para lograr esto, necesitará importar el módulo pickle de Python.

conectividad de base de datos en java con mysql

Módulo de pepinillo de Python:

El módulo pickle de Python entra en escena cuando en realidad está serializando o deserializando objetos en Python. Echemos un vistazo a un pequeño ejemplo,

EJEMPLO:

import pickle mylist = [1,2, 'abc'] mymsg = pickle.dumps (mylist) print (mymsg)

SALIDA: b’x80x03] qx00 (Kx01Kx02Xx03x00x00x00abcqx01e. ’

Como puede ver, en el programa anterior, 'mylist' se serializa usando la función dumps () del módulo pickle. También tenga en cuenta que la salida comienza con una 'b', lo que significa que se convierte en bytes. En la programación de socket, puede implementar este módulo para transferir objetos de python entre clientes y servidores.

¿Cómo usar el módulo pickle para transferir estructuras de objetos de Python?

Cuando usa pickle junto con sockets, puede transferir absolutamente cualquier cosa a través de la red. Anotemos las contrapartes del lado del servidor y del lado del cliente para transferir una lista del servidor al cliente:

Lado del servidor:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.bind ((socket.gethostname (), 2133)) #binding tuple s.Escuchar (5) while True: clt, adr = s.accept () print (f'Conexión a {adr} establecida ') m = {1:' Cliente ', 2:' Servidor '} mymsg = pickle.dumps (m) #el mensaje que queremos imprimir más tarde mymsg = {len (mymsg): {a}} 'utf-8') + mymsg clt.send (mymsg)

Aquí, m es un diccionario que es básicamente un que debe enviarse desde el servidor al cliente. Esto se hace primero serializando el objeto usando dumps () y luego convirtiéndolo en bytes.
Ahora anotemos la contraparte del lado del cliente:

Lado del cliente:

import socket import pickle a = 10 s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((socket.gethostname (), 2133)) while True: complete_info = b '' rec_msg = True while True: mymsg = s.recv (10) if rec_msg: print (f'La longitud del mensaje = {mymsg [: a]} ') x = int (mymsg [: a]) rec_msg = False complete_info + = mymsg if len (complete_info) -a == x: print ('Recibió la información completa') print (complete_info [a:]) m = pickle.loads (complete_info [a:]) print (m) rec_msg = True complete_info = b '' print (complete_info )

El primer ciclo while nos ayudará a realizar un seguimiento del mensaje completo (complete_info) así como del mensaje que se está recibiendo (rec_msg) usando el búfer. el mensaje configurando rec_
Luego, mientras se recibe el mensaje, lo único que hago es imprimir cada bit, que se recibe en un búfer de tamaño 10. Este tamaño puede ser cualquier cosa dependiendo de su elección personal.

Luego, si el mensaje recibido es igual al mensaje completo, simplemente estoy imprimiendo el mensaje como información completa recibida, después de lo cual he deserializado el mensaje usando cargas ().

La salida del programa anterior es la siguiente:

Esto nos lleva al final de este artículo sobre programación de sockets en Python. Espero que hayas entendido todos los conceptos con claridad.

Asegúrese de practicar tanto como sea posible y revertir su experiencia.

Tienes una pregunta para nosotros? Por favor, menciónelo en la sección de comentarios de este blog 'Programación de Socket en Python' y nos comunicaremos con usted lo antes posible.

Para obtener un conocimiento profundo de Python junto con sus diversas aplicaciones, puede inscribirse en Live con soporte 24/7 y acceso de por vida.