Tiempo de espera de aceptación de socket de Python
- Aceptación, rechazo y tiempo de espera del socket
- Métodos de socket y sus usos en Python
- Ejemplo de tiempo de espera de aceptación de socket en Python
- Establecer el tiempo de espera predeterminado para cada socket en Python
- Conclusión
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.
-
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 llamamossocket accept
. Este escenario es el objetivo final de abrir un socket. -
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. -
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
.
-
aceptar()
: como sugiere el nombre, el métodoaceptar()
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. -
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. -
listen()
: este es un método del lado del servidor que permite que el servidor acepte un socket para transferir datos entre las conexiones. -
connect()
: este método acepta una dirección como argumento. Luego conecta el enchufe remoto en la dirección. -
settimeout()
: este método acepta un número distinto de cero como el número de segundos de espera antes de generar unTimeoutError
. Este método es importante para mitigar el problema de los tiempos de espera infinitos. -
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.
-
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.
-
El segundo escenario es donde establecemos el límite de tiempo de espera usando el método
settimeout()
. En este caso, obtendrá elTimeoutError
después del límite establecido. -
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.