Il programma per il socket di Python richiede tempi infiniti per essere eseguito

1

Ho provato a eseguire il seguente programma sul mio terminale 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()

Ma non stampa nulla e richiede per sempre. Ho provato qualche piattaforma online da eseguire e ho ricevuto il messaggio di errore

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

Ho inserito l'istruzione di stampa dopo True: e prima della riga "data=" e stampa l'istruzione lì e poi impiega per sempre.

Il mio ambiente 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"

E su computer diversi, funziona.

Qualcuno può identificare un problema?

    
posta Amrit Joshi 28.02.2016 - 21:28
fonte

2 risposte

2

Il tuo programma funziona bene con i miei Mac OS Mavericks (aka 10.9.5) con Python 2.7.5 Stampa:

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

Immagino che il tuo programma si sia bloccato mentre nessuna risposta era disponibile entro il timeout del protocollo TCP (il server non rispondeva o il collegamento falliva). Se si desidera evitare tale caso, è possibile inserire l'istruzione "recv" in un thread separato e interrompere dopo un timeout. Ho trovato molto aiuto in questa pagina: eli.thegreenplace. net / 2011/05/18 / codice di esempio-presa-client-thread-in-python /

Spero che questo aiuti.

    
risposta data 27.03.2016 - 10:00
fonte
0

Nella sezione in cui si dice:

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

Potrebbe esserci una connessione internet lenta, quindi il fatto che ci sta mettendo così tanto tempo.

Inoltre, i siti web di emulazione di python intelligenti non ti permetteranno di eseguire socket sui loro emulatori, poiché puoi spoofare il tuo IP e questo può causare problemi di CyberSecurity.

    
risposta data 29.02.2016 - 15:48
fonte

Leggi altre domande sui tag