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?
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.
mmmmmm