El programa de socket de Python tarda una eternidad en ejecutarse

Intenté ejecutar el siguiente programa en mi terminal 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é alguna plataforma en línea para ejecutar y recibí un mensaje de error

"""Rastreo (última llamada más reciente): Archivo "main.py", línea 6, en 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] Se agotó el tiempo de conexión"""

Puse la declaración de impresión después de True: y antes de la línea "data =" e imprime la declaración allí y luego toma una eternidad.

Mi entorno 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 diferentes computadoras, funciona.

¿Alguien puede identificar un problema?

Formatee el código usando Markdown; consulte las preguntas frecuentes; también muestre el código como texto, no como una captura de pantalla, para que podamos copiarlo, ejecutarlo y probarlo. También puede conectarse a esa URL en esa computadora usando telnet, etc.

Respuestas (2)

Su programa funciona bien en mi MAC OS Mavericks (también conocido como 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 su programa se atascó mientras no había respuesta disponible dentro del tiempo de espera del protocolo TCP (ya sea que el servidor no responda o que el enlace falle). Si desea evitar tal caso, puede poner la declaración "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.

En el apartado donde dice:

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

Puede haber una conexión a Internet lenta, de ahí que esté tardando tanto.

Además, los sitios web inteligentes de emulación de Python no le permitirán ejecutar sockets en sus emuladores, ya que puede falsificar su IP y eso puede causar problemas de seguridad cibernética.