Tiempo de espera de aceptación de socket de Python

Mohd Mohtashim Nawaz 21 junio 2023
  1. Aceptación, rechazo y tiempo de espera del socket
  2. Métodos de socket y sus usos en Python
  3. Ejemplo de tiempo de espera de aceptación de socket en Python
  4. Establecer el tiempo de espera predeterminado para cada socket en Python
  5. Conclusión
Tiempo de espera de aceptación de socket de Python

El socket es el bloque de construcción básico para la comunicación de red. Se abre un socket cada vez que dos entidades de red necesitan transferir los datos.

Estos enchufes permanecen conectados durante la sesión. Pero a veces, mientras trabaja con sockets en Python, puede esperar largos períodos mientras el otro extremo aún acepta la conexión del socket.

Este artículo analiza la función de tiempo de espera de los sockets en Python que es necesaria para mitigar el problema de esperar la aceptación del socket durante un tiempo infinito.

Aceptación, rechazo y tiempo de espera del socket

Cada vez que intente establecer una conexión con un servidor utilizando el script de Python, debe abrir una conexión de socket. Esta conexión de socket actúa como un túnel para transferir los datos entre el cliente y el servidor.

En el proceso de apertura del zócalo, hay tres escenarios.

  1. Socket Accept: cuando el socket se abre con éxito y el servidor y el cliente ahora están conectados para enviar y recibir datos, lo llamamos socket accept. Este escenario es el objetivo final de abrir un socket.

  2. Rechazo de socket: digamos que abrió un socket pero pasó algunos parámetros diferentes, olvidó pasar parámetros o no siguió correctamente el proceso de apertura de un socket; obtendrías un rechazo. Significa que no se pudo establecer la conexión para enviar y recibir datos.

  3. Tiempo de espera de aceptación de socket: este es un escenario importante pero que se pasa por alto. A veces, cuando intenta abrir un enchufe, es posible que no obtenga ninguna respuesta del otro extremo.

    Debido a esto, te quedas esperando para siempre. Esta es una situación no deseada ya que le gustaría cerrar la solicitud actual e intentar otra solicitud en lugar de esperar para siempre.

    La opción de tiempo de espera le permite establecer el tiempo máximo de espera para que su solicitud sea aceptada por la otra parte. Después de que se excede el límite de tiempo, se genera un error.

Métodos de socket y sus usos en Python

Python tiene una biblioteca incorporada con el nombre socket que debe importar para trabajar con conexiones de socket. Veamos algunos de los métodos importantes de la biblioteca socket.

  1. aceptar(): como sugiere el nombre, el método aceptar() acepta una solicitud de socket entrante de otra parte. Este método devuelve una conexión de socket que puede usar para transferir los datos entre las entidades conectadas.

  2. bind(): este método vincula o adjunta una conexión de socket a una dirección. Este método debe llamarse método si desea trabajar con sockets.

    El método bind() acepta una tupla de una dirección IP y un puerto al que enlaza el socket.

  3. listen(): este es un método del lado del servidor que permite que el servidor acepte un socket para transferir datos entre las conexiones.

  4. connect(): este método acepta una dirección como argumento. Luego conecta el enchufe remoto en la dirección.

  5. settimeout(): este método acepta un número distinto de cero como el número de segundos de espera antes de generar un TimeoutError. Este método es importante para mitigar el problema de los tiempos de espera infinitos.

  6. setdefaulttimeout(): si está utilizando varias conexiones de socket y le gustaría establecer el mismo límite de tiempo de espera para cada conexión, entonces este es el método de referencia para su propósito. Acepta el número de segundos como argumento y lo aplica a todas las nuevas conexiones de socket como límite de tiempo de espera.

Ejemplo de tiempo de espera de aceptación de socket en Python

Veamos un ejemplo de tiempo de espera de aceptación de socket con la ayuda del código en Python. Para este ejemplo, necesitaríamos escribir dos scripts de Python, uno para el servidor y otro para el cliente.

Veríamos tres escenarios diferentes, como se analiza a continuación.

  1. El primer escenario es cuando no hay un límite de tiempo de espera establecido. En este caso, el cliente seguiría esperando.

    Tenga en cuenta que, dependiendo de su sistema operativo, la solicitud puede rechazarse automáticamente después de un tiempo.

  2. El segundo escenario es donde establecemos el límite de tiempo de espera usando el método settimeout(). En este caso, obtendrá el TimeoutError después del límite establecido.

  3. En el tercer caso, utilizaremos el método setdefaulttimeout() para establecer el límite de tiempo de espera.

Veamos los códigos de los tres casos anteriores uno por uno.

Tiempo de espera de aceptación de socket en Python cuando no se establece un límite de tiempo de espera

Script del lado del servidor:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(("", 1717))

Script del lado del cliente:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect(("127.0.0.1", 1717))

No puede ver ningún método escuchar () en el lado del servidor. Por lo tanto, el servidor no responde y el cliente está esperando.

Tiempo de espera de aceptación de socket en Python cuando se establece el tiempo de espera

En este caso, verá que el cliente aborta la operación y genera un TimeoutError después de que se pasa el tiempo de espera.

Lado del servidor:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(("", 1717))

Lado del cliente:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.settimeout(3)
    s.connect(("127.0.0.1", 1717))

En este caso, se genera un socket de Python TimeoutError. Tenga en cuenta que los sockets pueden comportarse de manera diferente según la plataforma.

En la máquina Linux, el zócalo arroja el error ConnectionRefusedError: [Errno 111] Conexión rechazada hasta que no acepta el zócalo en el lado del servidor.

Establecer el tiempo de espera predeterminado para cada socket en Python

Este método establecería el mismo tiempo de espera predeterminado para todos sus nuevos sockets. De esta manera, puede ahorrar tiempo y molestias configurando el tiempo de espera para cada socket por separado.

Lado del servidor:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind(("", 1717))

Lado del cliente:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    socket.setdefaulttimeout(3)
    s.connect(("127.0.0.1", 1717))

Tenga en cuenta que para setdefaulttimeout(), debe usar la clase de socket directamente en lugar del objeto porque establece el tiempo de espera para todos los subprocesos.

Conclusión

El tiempo de espera del socket es un aspecto importante de la programación de sockets en Python. Si no maneja el tiempo de espera, puede dejar a su cliente esperando el socket para siempre.

O en el otro caso, dependiendo de la implementación de su entorno, puede arrojar un error.

Artículo relacionado - Python Socket