Programación de redes en Python

Python proporciona servicios de red a dos niveles de acceso:

  • Los servicios de red de bajo nivel admiten Socket básico, que proporciona la API estándar de BSD Sockets y puede acceder a todos los métodos de la interfaz Socket del sistema operativo subyacente.
  • El módulo de servicios de red de alto nivel SocketServer, que proporciona clases centradas en el servidor, puede simplificar el desarrollo de servidores de red.

¿Qué es Socket?

Socket, también llamado "conector", las aplicaciones normalmente realizan solicitudes a la red o responden a solicitudes de red a través del "conector", permitiendo la comunicación entre hosts o entre procesos en una misma computadora.


La función socket()

En Python, usamos la función socket() para crear un socket. El formato de sintaxis es el siguiente:

socket.socket([family[, type[, proto]]])

Parámetros

  • family: la familia de sockets puede ser AF_UNIX o AF_INET.
  • type: el tipo de socket se puede dividir según sea orientado a conexión o sin conexión.SOCK_STREAMoSOCK_DGRAM。
  • protocol: generalmente no se completa y por defecto es 0.

Métodos (integrados) del objeto Socket

Función Descripción
Socket del lado del servidor
s.bind() Vincula la dirección (host, port) al socket. En AF_INET, la dirección se representa como una tupla (host, port).
s.listen() Inicia la escucha TCP. backlog especifica el número máximo de conexiones que el sistema operativo puede poner en espera antes de rechazar conexiones. Este valor debe ser al menos 1; en la mayoría de las aplicaciones basta con establecerlo en 5.
s.accept() Acepta pasivamente conexiones de clientes TCP, esperando (en modo bloqueante) la llegada de conexiones.
Socket del cliente
s.connect() Inicializa activamente una conexión con el servidor TCP. Generalmente el formato de address es una tupla (hostname, port). Si la conexión falla, devuelve el error socket.error.
s.connect_ex() Versión extendida de la función connect(); en caso de error devuelve el código de error en lugar de lanzar una excepción.
Funciones de socket de uso general
s.recv() Recibe datos TCP. Los datos se devuelven como una cadena; bufsize especifica la cantidad máxima de datos a recibir. flag proporciona información adicional sobre el mensaje y generalmente puede ignorarse.
s.send() Envía datos TCP. Envía los datos de string al socket conectado. El valor de retorno es el número de bytes enviados, que puede ser menor que el tamaño en bytes de string.
s.sendall() Envía completamente datos TCP. Envía los datos de string al socket conectado, pero intenta enviar todos los datos antes de regresar. En caso de éxito devuelve None; en caso de fallo lanza una excepción.
s.recvfrom() Recibe datos UDP. Es similar a recv(), pero el valor de retorno es (data, address), donde data es una cadena que contiene los datos recibidos y address es la dirección del socket que envió los datos.
s.sendto() Envía datos UDP. Envía datos a un socket; address es una tupla con la forma (ipaddr, port) que especifica la dirección remota. El valor de retorno es el número de bytes enviados.
s.close() Cierra el socket
s.getpeername() Devuelve la dirección remota del socket conectado. El valor de retorno suele ser una tupla (ipaddr, port).
s.getsockname() Devuelve la dirección propia del socket. Normalmente es una tupla (ipaddr, port).
s.setsockopt(level,optname,value) Establece el valor de la opción dada del socket.
s.getsockopt(level,optname[.buflen]) Devuelve el valor de la opción del socket.
s.settimeout(timeout) Establece el período de tiempo de espera para operaciones de socket. timeout es un número flotante en segundos. Un valor de None significa que no hay período de tiempo de espera. Generalmente, el período de tiempo de espera debe establecerse justo después de crear el socket, ya que puede usarse para operaciones como connect().
s.gettimeout() Devuelve el valor actual del período de tiempo de espera en segundos; si no se ha establecido, devuelve None.
s.fileno() Devuelve el descriptor de archivo del socket.
s.setblocking(flag) Si flag es 0, establece el socket en modo no bloqueante; de lo contrario, lo establece en modo bloqueante (valor predeterminado). En modo no bloqueante, si la llamada a recv() no encuentra datos o la llamada a send() no puede enviar datos inmediatamente, se producirá una excepción socket.error.
s.makefile() Crea un archivo asociado a este socket.

Ejemplo sencillo

Servidor

Usamos la función del módulo socketsocketpara crear un objeto socket. El objeto socket puede configurar un servicio socket llamando a otras funciones.

Ahora podemos especificar el puerto del servicio llamando a la funciónbind(hostname, port)para especificar elpuerto (port)。

Luego, llamamos al método del objeto socketacceptEste método espera la conexión del cliente y devuelve unconnectionobjeto, que indica que se ha conectado al cliente.

El código completo es el siguiente:

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- # Nombre de archivo: server.py import socket # Importar el módulo socket s = socket.socket() # Crear objeto socket host = socket.gethostname() # Obtener el nombre de host local port = 12345 # Establecer el puerto s.bind((host, port)) # Vincular el puerto s.listen(5) # Esperar la conexión del cliente while True: c,addr = s.accept() # Establecer conexión con el cliente print 'Dirección de conexión:', addr c.send('¡Bienvenido al tutorial para principiantes!') c.close() # Cerrar la conexión

Cliente

A continuación, escribimos un ejemplo de cliente sencillo que se conecta al servicio creado anteriormente. El número de puerto es 12345.

socket.connect(hostname, port )El método abre una conexión TCP al hosthostnamecon el puertoportdel servidor. Después de conectarnos, podemos obtener datos del servidor. Recuerde que debe cerrar la conexión después de completar la operación.

El código completo es el siguiente:

Ejemplo

#!/usr/bin/python # -*- coding: UTF-8 -*- # Nombre de archivo: client.py import socket # Importar el módulo socket s = socket.socket() # Crear objeto socket host = socket.gethostname() # Obtener el nombre de host local port = 12345 # Establecer el número de puerto s.connect((host, port)) print s.recv(1024) s.close()

Ahora abrimos dos terminales; en la primera terminal ejecutamos el archivo server.py:

$ python server.py

En la segunda terminal ejecutamos el archivo client.py:

$ python client.py 
欢迎访问Ejemplo!

En ese momento, si volvemos a abrir la primera terminal, veremos la siguiente información de salida:

连接地址: ('192.168.0.118', 62461)

Módulos de Internet de Python

A continuación se enumeran algunos módulos importantes para la programación de redes en Python:

ProtocoloFunción / utilidadNúmero de puertoMódulo de Python
HTTPAcceso a páginas web80httplib, urllib, xmlrpclib
NNTPLeer y publicar artículos de noticias, comúnmente llamados "posts".119nntplib
FTPTransferencia de archivos20ftplib, urllib
SMTPEnviar correo electrónico25smtplib
POP3Recibir correo electrónico110poplib
IMAP4Recuperar correo electrónico143imaplib
TelnetLínea de comandos23telnetlib
GopherBúsqueda de información70gopherlib, urllib

Para más contenido, consulte el sitio web oficial:Python Socket Library and Modules。

Otras extensiones