Python-Socket-Programm braucht ewig zum Ausführen

Ich habe versucht, das folgende Programm auf meinem Mac-Terminal auszuführen.

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()

Aber es druckt nichts und dauert ewig. Ich habe versucht, eine Online-Plattform auszuführen, und eine Fehlermeldung erhalten

"""Traceback (letzter Aufruf zuletzt): Datei "main.py", Zeile 6, in mysock.connect(('www.py4inf.com', 80)) Datei "/usr/lib64/python2.7/socket .py", Zeile 228, geben Sie in meth getattr(self._sock,name)(*args) socket.error zurück: [Errno 110] Connection timed out"""

Ich setze die print-Anweisung nach True: und vor die Zeile "data = " und es druckt die Anweisung dort und dauert dann ewig.

Meine Python-Umgebung ist

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

Und in verschiedenen Computern funktioniert es.

Kann jemand ein Problem identifizieren?

Bitte formatieren Sie den Code mit Markdown - siehe FAQ - zeigen Sie den Code auch als Text und nicht als Screenshot, damit wir ihn kopieren, ausführen und testen können. Können Sie auch mit Telnet usw. eine Verbindung zu dieser URL auf diesem Computer herstellen?

Antworten (2)

Ihr Programm läuft gut auf meinem MAC OS Mavericks (auch bekannt als 10.9.5) mit Python 2.7.5. Es druckt:

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

Ich vermute, Ihr Programm ist hängen geblieben, während innerhalb des Timeouts des TCP-Protokolls keine Antwort verfügbar war (entweder der Server antwortet nicht oder die Verbindung schlägt fehl). Wenn Sie einen solchen Fall vermeiden möchten, können Sie die "recv"-Anweisung in einen separaten Thread stellen und nach einem Timeout abbrechen. Ich habe auf dieser Seite viel Hilfe dafür gefunden: eli.thegreenplace.net/2011/05/18/code-sample-socket-client-thread-in-python/

Hoffe das hilft.

In dem Abschnitt, wo es heißt:

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

Es kann eine langsame Internetverbindung geben - daher dauert es so lange.

Außerdem lassen Sie clevere Python-Emulations-Websites nicht zu, dass Sie Sockets auf ihren Emulatoren ausführen, da Sie Ihre IP-Adresse fälschen können, was CyberSecurity-Probleme verursachen kann.