1 votos

El programa de socket de Python tarda una eternidad en ejecutarse

He intentado ejecutar el siguiente programa en el terminal de mi Mac.

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')

while True:
    data = mysock.recv(512)
    if ( len(data) < 1 ) :
        break
    print data;
mysock.close()

Pero no imprime nada y tarda una eternidad. Probé con alguna plataforma online para ejecutarlo y obtuve mensaje de error

"""Traceback (most recent call last): File "main.py", line 6, in mysock.connect(('www.py4inf.com', 80)) Archivo "/usr/lib64/python2.7/socket.py", línea 228, en meth return getattr(self._sock,name)(*args) socket.error: [Errno 110] Conexión timed out""

Pongo la sentencia print después de True: y antes de la línea "data = " y ahí imprime la sentencia y luego se eterniza.

Mi entorno de Python es

"Python 2.7.10 (default, Jul 14 2015, 19:46:27)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin"

Y en otro ordenador, funciona.

¿Alguien puede identificar un problema?

1voto

zechdc Puntos 438

Su programa funciona bien en mi MAC OS Mavericks (aka 10.9.5) con Python 2.7.5 Imprime:

HTTP/1.1 200 OK
Date: Sun, 27 Mar 2016 07:42:22 GMT
Server: Apache
Last-Modified: Fri, 04 Dec 2015 19:05:04 GMT
ETag: "e103c2f4-a7-526172f5b5d89"
Accept-Ranges: bytes
Content-Length: 167
Cache-Control: max-age=604800, public
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: origin, x-requested-with, content-type
Access-Control-Allow-Methods: GET
Connection: close
Content-Type: text/plain

But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fai
r sun and kill the envious moon
Who is already sick and pale with grief

Supongo que tu programa se atascó mientras no había respuesta dentro del tiempo de espera del protocolo TCP (ya sea porque el servidor no responde o porque el enlace falla). Si quieres evitar este caso, puedes poner la sentencia "recv" en un hilo separado y romper después de un tiempo de espera. Encontré mucha ayuda para esto en esta página: eli.thegreenplace.net/2011/05/18/code-sample-socket-client-thread-in-Python/

Espero que esto ayude.

0voto

Hazim Sager Puntos 6

En la sección donde dice:

mysock.connect(('www.py4inf.com', 80))

Es posible que la conexión a Internet sea lenta, de ahí que tarde tanto en llegar.

Además, los sitios web inteligentes de emulación de Python no te dejarán ejecutar sockets en sus emuladores, ya que puedes falsificar tu IP y eso puede causar problemas de ciberseguridad.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X