Программа сокетов Python, которая вечно запускается

Я попытался запустить следующую программу на своем терминале 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()

Но он ничего не печатает и занимает вечность. Я попробовал запустить какую-то онлайн-платформу и получил сообщение об ошибке

"""Traceback (последний последний вызов): файл "main.py", строка 6, в mysock.connect(('www.py4inf.com', 80)) файл "/usr/lib64/python2.7/socket .py", строка 228, в meth return getattr(self._sock,name)(*args) socket.error: [Errno 110] Время ожидания соединения истекло"""

Я ставлю оператор печати после True: и перед строкой «data =», и он печатает оператор тут же и занимает вечность.

Моя среда Python

"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"

И на другом компе работает.

Кто-нибудь может определить проблему?

Пожалуйста, отформатируйте код, используя уценку — см. FAQ — также, пожалуйста, покажите код в виде текста, а не скриншота, чтобы мы могли скопировать, запустить и протестировать его. Также вы можете подключиться к этому URL-адресу на этом компьютере с помощью telnet и т. д.

Ответы (2)

Ваша программа хорошо работает на моей MAC OS Mavericks (также известной как 10.9.5) с Python 2.7.5. Она печатает:

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

Я предполагаю, что ваша программа зависла, когда ответ не был доступен в течение тайм-аута протокола TCP (либо сервер не отвечает, либо сбой связи). Если вы хотите избежать такого случая, вы можете поместить оператор "recv" в отдельный поток и прервать его после тайм-аута. Я нашел много помощи для этого на этой странице: eli.thegreenplace.net/2011/05/18/code-sample-socket-client-thread-in-python/

Надеюсь это поможет.

В разделе, где написано:

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

Может быть медленное интернет-соединение - отсюда и тот факт, что это занимает так много времени.

Кроме того, умные веб-сайты эмуляции Python не позволят вам запускать сокеты на своих эмуляторах, поскольку вы можете подделать свой IP-адрес, что может вызвать проблемы с кибербезопасностью.