2016-10-05 6 views
0

は私のコードです:実行時間(本当に遅い)

import socket 
import time 
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
mysock.connect(('www.py4inf.com', 80)) 
mysock.send(b'GET /code/romeo.txt HTTP/1.1\n') 
mysock.send(b'Host: www.py4inf.com\n\n') 
all = b"" 

while True: 
    data = mysock.recv(512) 
    all = all + data 
    if len(data) < 1: 
     break 

mysock.close() 

stuff = all.decode() 
position = stuff.find('\r\n\r\n') 
print(stuff[position+4:]) 

それはwhileループでブレークを呼び出すために、ほぼ30秒かかりますので、何か問題があるに違いありません。 しかし、コードif len(data) < 1:if len(data) < 100:に変更するとわずか0.5秒しかかかりませんでした。

助けてください。それはしばらく私を悩ましました。 サンプルWebサイト:

+0

これは完璧な意味を持ちます。もちろん、非常に起こりそうもないものはずっと長くなる可能性があります。代わりに、自分が何をしようとしているのか自分に尋ねてください。あなたはいつソケットでリッスンを止めたいですか? –

+1

この質問はここで多くの時間ここで議論されています(例:http://stackoverflow.com/questions/17667903/python-socket-receive-large-amount-of-data)。あなたのコードには何も問題はありません。これはソケットの仕組みです。 mysock.recv(512)は512バイトを待ちます。しばらくすると、接続は単に破棄されます。ノンブロッキングソケットのPythonドキュメントを見てください:https://docs.python.org/3/howto/sockets.html#non-blocking-sockets –

+0

私はそれを手に入れます!上記のコードをlen(data)<100の場合に変更します。これは、mysock.recv(512)からの2回目の受信が偶然に100未満になるためです。そういうわけで、それは実行時間をそんなに減らすことができます。また、私はソケットに少し慣れているように、あなたのコメントを本当に感謝します。私はいつかあなた達と同じくらい良いことができることを願っています。 – JianWei

答えて

0

Webサーバーはすぐに接続を閉じる必要はありません。実際、別のhttp要求を探している可能性があります。 recvの後にprint(data)を追加すると、データを取得した後、一時停止してからb''と表示されます。これは、サーバーが最後にソケットを閉じたことを意味します。

また、サーバーが「Content-Length:167 \ r \ n」を含むヘッダーを送信していることにも気付くでしょう。ヘッダーが終了すると、サーバーは正確に167バイトのデータを送信します。あなた自身でヘッダーを解析することができますが、そのためにurllibrequestsのようなクライアントライブラリがあります。

すぐに接続を閉じるためにリクエストヘッダーにどれくらい追加する必要があるのか​​不思議で、Connection: closeと思われました。これはすぐに返されます:

import socket 
import time 
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
mysock.connect(('www.py4inf.com', 80)) 
mysock.send(b'GET /code/romeo.txt HTTP/1.1\n') 
mysock.send(b'Connection: close\n') 
mysock.send(b'Host: www.py4inf.com\n\n') 
all = b"" 

while True: 
    data = mysock.recv(512) 
    all = all + data 
    if len(data) < 1: 
     break 

mysock.close() 

stuff = all.decode() 
position = stuff.find('\r\n\r\n') 
print(stuff[position+4:]) 
+0

ありがとう、それをありがとう! – JianWei

関連する問題