Introducción
La programación de redes y comunicaciones son usos particularmente poderosos de cualquier lenguaje de programación. Es mucho más común en estos días que las computadoras interactúen entre sí (o con una red completa, como Internet) que que una máquina actúe sola, y saber exactamente cómo se lleva a cabo esa comunicación es una habilidad importante para cualquier programador. Si es un aficionado a Python, es posible que sepa que Python tiene varias bibliotecas completas diseñadas para simplificar la programación de redes.
.
Requisitos
- Cualquier versión de Python (Consulte nuestra Guía para instalar Python 2.7 en Centos)
- Comprensión básica de Python
Enchufes
Una de las bibliotecas de importación más básicas y útiles es socket
biblioteca. Permite al programador definir, crear, usar y destruir conexiones de red conocidas como sockets .
Entonces, ¿qué es exactamente es un enchufe? En términos de red, un socket es el punto final de una conexión, definido por una dirección IP y un número de puerto. Una conexión utiliza un par de enchufes:origen y destino.
Los programas normalmente usan sockets para permitir que dos computadoras se comuniquen. Los sockets también se pueden usar para pasar datos entre diferentes aplicaciones o incluso diferentes partes del mismo programa. Podemos demostrar cómo funciona un socket con dos aplicaciones o dos partes separadas de una aplicación en ejecución:una parte del servidor, que escucha las conexiones, y una parte del cliente, que intenta conectarse a un servidor. Cuando su computadora solicita una página web, por ejemplo, abre un socket, generalmente vinculándolo al puerto 80 (para HTTP), y se conecta a un servidor web, utilizando el mismo identificador de puerto y socket. Toda la comunicación relacionada pasa por ese punto final. Cuando finaliza la comunicación, el cliente cierra el socket y la conexión a la que está vinculado.
La biblioteca de sockets en Python está bien desarrollada y es fácil de usar. Para usar la biblioteca, coloque import socket
al comienzo de su programa. Este comando le da a su programa acceso a todas las funciones incluidas de la biblioteca de sockets, como socket()
(crear un nuevo objeto de socket), socketpair()
(cree un par de nuevos objetos de socket), y gethostbyname()
(asignar un nombre de host a su dirección IP), por nombrar algunos.
.
Experimentando con la biblioteca de sockets
Para experimentar con sockets en nuestra máquina local, escribiremos un script de Python para crear una aplicación de servidor que cree un socket abierto. Luego ejecutaremos ese código y, en otra ventana de terminal, haremos telnet a nuestra máquina local (en localhost) usando el puerto que abrimos en el script del servidor.
Comencemos con un script que llamaremos server.py
. Este programa abrirá un socket, lo vinculará a un puerto y protocolo, y luego escuchará las conexiones.
import socket # (1) host = '' # (2) port = 1234 # (3) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # (4) s.bind((host, port)) # (5) print 'Socket created' # (6) s.listen(10) # (7) print 'Socket listening' # (8) conn, addr = s.accept() # (9) print 'Connected with ' + addr[0] + ':' + str(addr[1]) # (10)
Guarde este archivo como server.py
. En una ventana de terminal (o en el símbolo del sistema, si está usando Windows), navegue hasta la ubicación de su archivo y ejecútelo.
python server.py
Déjelo en ejecución y abra una segunda ventana de terminal. En esa ventana, inicie una conexión telnet al host local en el puerto 1234.
telnet localhost 1234
Una vez que se conecta, debería ver la ventana de terminal original impresa 'Conectado con 127.0.0.1:60426' o algo similar, mientras que la ventana de su cliente mostrará brevemente 'Conectado a localhost' antes de que finalice la conexión.
.
Qué está haciendo el código de socket
Entonces, ¿qué está pasando aquí? Veamos cada línea:
La línea (1) importa el socket
biblioteca y la pone a disposición para su uso. Las líneas (2) y (3) establecen variables para host
y port
, respectivamente. El host
en blanco variable (que es una cadena vacía entre comillas simples, por cierto, NO una comilla doble) significa que la aplicación del servidor escuchará en todas las interfaces disponibles, incluido localhost, que es el que usaremos para conectarnos.
La línea (4) crea el socket en sí, utilizando dos parámetros. El primer parámetro, AF_INET
, significa que estamos usando direcciones IPv4 (a diferencia de las direcciones IPv6). El segundo parámetro, SOCK_STREAM
, significa que este socket usará paquetes TCP (el tráfico UDP usa el tipo SOCK_DGRAM
y funciona un poco diferente, pero eso está más allá del alcance de este artículo). La línea (5) une el socket que hemos creado al (host, port)
tupla.
La línea (7) le dice al programa que escuche las conexiones al socket que enlazamos en la línea (5). El 10
El parámetro indica que el servidor aceptará hasta 10 conexiones antes de rechazar un cliente.
La línea (9) asigna variables a la conexión una vez que el servidor acepta una conexión. La línea (10) imprime la dirección IP y el número de puerto del cliente que ha realizado la conexión con el servidor.
.
Mantener el zócalo abierto
Cuando probamos este código, vimos que el servidor cerró la conexión de inmediato, lo que no es particularmente útil. Para que podamos ver los datos transferidos de un lado a otro a través de la conexión, agregaremos cuatro líneas de código a nuestro server.py
programa.
data = conn.recv(1024) # 11 conn.sendall(data) # 12 conn.close() # 13 s.close() # 14
Nuevamente, si ejecuta este código en una ventana de terminal y luego se conecta (desde otro terminal) con telnet localhost 1234
, se conectará a localhost, pero esta vez la conexión permanecerá abierta. Escriba una palabra en la ventana de telnet y luego presione Return
; la palabra se repetirá en esa misma pantalla y luego la conexión se cerrará.
En la línea (11), los data
variable almacena los datos recibidos a través de la conexión.
La línea (12) envía esos datos de regreso a través de la conexión al cliente, en otras palabras, repitiéndolos.
Finalmente, las líneas (13) y (14) practican un poco de limpieza cerrando la conexión y destruyendo el socket; nunca es una mala idea, especialmente cuando se codifica una aplicación basada en socket que se lanzará a la naturaleza.
.
Conclusión
Este script es un ejemplo muy básico de cómo crear una conexión de red utilizando el socket
de Python. módulo, comuníquese a través de la conexión y luego ciérrelo de nuevo. Si bien una aplicación desarrollada será mucho más complicada, la estructura de comunicación básica, y la teoría detrás de ella, sigue siendo la misma.
Esperamos que haya disfrutado este tutorial y haya aprendido lo suficiente para comenzar a trabajar con sockets en Python. Asegúrese de volver a consultar para ver más tutoriales y de consultar nuestras soluciones confiables de alojamiento VPS.
.
.