Programación de red en Python3

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 proporciona clases centrales de servidor que pueden simplificar el desarrollo de servidores de red.

¿Qué es Socket?

Socket también se llama "toma" (socket). Las aplicaciones normalmente envían solicitudes a la red o responden a solicitudes de red a través del "socket", permitiendo la comunicación entre hosts o entre procesos en una misma computadora.


Función socket()

En Python, usamos la función socket() para crear un socket, la sintaxis es la siguiente:

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

Parámetros

  • family: la familia del socket 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ónSOCK_STREAMoSOCK_DGRAM
  • proto: normalmente no se rellena, 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, puerto) al socket. En AF_INET, la dirección se representa como una tupla (host, puerto).
s.listen() Comienza la escucha TCP. backlog especifica el número máximo de conexiones pendientes que el sistema operativo puede mantener antes de rechazar conexiones. Este valor debe ser al menos 1; la mayoría de las aplicaciones lo establecen en 5.
s.accept() Acepta pasivamente conexiones TCP de clientes, (en modo bloqueante) espera a que llegue la conexión.
Socket del cliente
s.connect() Inicia activamente una conexión con el servidor TCP. Generalmente el formato de address es una tupla (hostname, puerto). 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 público
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, generalmente se puede ignorar.
s.send() Envía datos TCP; envía los datos de string al socket conectado. El valor de retorno es la cantidad de bytes enviados, que puede ser menor que el tamaño en bytes de string.
s.sendall() Envía completamente los datos TCP. Envía los datos de string al socket conectado, pero intenta enviar todos los datos antes de regresar. Devuelve None si tiene éxito y lanza una excepción si falla.
s.recvfrom() Recibe datos UDP, 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 envía los datos.
s.sendto() Envía datos UDP; envía los datos al socket. address es una tupla de la forma (ipaddr, puerto) 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, puerto).
s.getsockname() Devuelve la dirección del propio socket. Normalmente es una tupla (ipaddr, puerto).
s.setsockopt(level,optname,value) Establece el valor de la opción dada para el 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 (timeout) para las operaciones del socket. timeout es un número flotante en segundos. El valor None indica que no hay período de tiempo de espera. Generalmente, el tiempo de espera debe establecerse justo después de crear el socket, porque puede usarse para operaciones de conexión (como connect()).
s.gettimeout() Devuelve el valor actual del 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 False, 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 generará 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, llamando a la funciónbind(hostname, port)especificar el serviciopuerto (port)。

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

El código completo es el siguiente:

Ejemplo

#!/usr/bin/python3
# Nombre de archivo: server.py

# Importar los módulos socket, sys
import socket
import sys

# Crear el objeto socket
serversocket = socket.socket(
            socket.AF_INET, socket.SOCK_STREAM)

# Obtener el nombre del host local
host = socket.gethostname()

port = 9999

# Vincular el número de puerto
serversocket.bind((host, port))

# Establecer el número máximo de conexiones; más allá, se ponen en cola
serversocket.listen(5)

while True:
    # Establecer conexión con el cliente
    clientsocket,addr = serversocket.accept()      

    print("Dirección de conexión: %s" % str(addr))
   
    msg='¡Bienvenido a Ejemplo!'+ "\r\n"
    clientsocket.send(msg.encode('utf-8'))
    clientsocket.close()

Cliente

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

socket.connect(hostname, port )El método abre una conexión TCP al hosthostnamepuertoportdel proveedor de servicios. Después de conectarnos, podemos obtener datos del servidor. Recuerda que debes cerrar la conexión después de completar la operación.

El código completo es el siguiente:

Ejemplo

#!/usr/bin/python3
# Nombre de archivo: client.py

# Importar los módulos socket, sys
import socket
import sys

# Crear el objeto socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Obtener el nombre del host local
host = socket.gethostname()

# Establecer el número de puerto
port = 9999

# Conectar al servicio, especificar host y puerto
s.connect((host, port))

# Recibir datos de menos de 1024 bytes
msg = s.recv(1024)

s.close()

print (msg.decode('utf-8'))

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

$ python3 server.py

En la segunda terminal ejecutamos el archivo client.py:

$ python3 client.py 
欢迎访问Ejemplo!

En este momento, si volvemos a abrir la primera terminal, veremos que se muestra la siguiente información:

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

Módulos de Internet de Python

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

ProtocoloFunción/usoNú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 correos25smtplib
POP3Recibir correos110poplib
IMAP4Obtener correos143imaplib
TelnetLínea de comandos23telnetlib
GopherBúsqueda de información70gopherlib, urllib

Para más contenido, consulte lasPython Socket Library and Modules。

otras extensiones del sitio web oficial.