1

可能な限り短いと思うので、コード全体を貼り付けています。

import socket

def recv_all(sock):
    parts = []
    while True:
        msg = ""
        msg = sock.recv(4096)
        print "recieved", len(msg), "bytes."
        if not msg:
            break
        parts.append(msg)
    return "".join(parts)

http_request = """GET / HTTP/1.1
Host: {}
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64; U; tr) Presto/2.10.229 Version/11.64
Accept: text/html, application/xml;q=0.9, application/xhtml xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: en
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Connection: Keep-Alive, TE
TE: deflate, gzip, chunked, identity, trailers


"""
site = "www.google.com.tr"
print "creating connection"
conn = socket.create_connection((site,80))
print "sending data"
conn.sendall(http_request.format(site))
print "recieving response"
response = recv_all(conn)
print "closing connection"
conn.close()

print response

これを実行すると、次の出力が得られます。

接続の作成
データの送信
応答の受信
3743 バイトを受信しました。
4096 バイトを受信しました。
4096 バイトを受信しました。
4096 バイトを受信しました。
3472 バイトを受信しました。
1648 バイトを受信しました。

私が期待していたのは、最後のチャンク (この場合は 1648) を読み取った後に 0 バイトを読み取ることです。しかし、それは代わりに待ち続けます。

私はPython 2.7でWindows 7を使用しています。

ここで何が間違っていますか?意図したとおりに動作させるにはどうすればよいですか?

4

3 に答える 3

5

送信します:

Connection: Keep-Alive, TE

...そしてサーバーはあなたが要求したとおりに動作しています-最後に接続を維持します。したがって、読み取り呼び出しはブロックされ、サーバーが同じ接続で別の要求を待機している間、より多くのデータを待機します。

keep-aliveをオフにする Content-Lengthヘッダーを探し、その量のデータを読み取ったら読み取りを停止します。

(または、自分でやろうとするのではなく、HTTPクライアントライブラリを使用してください:)

于 2012-08-22T19:34:33.577 に答える
1

キーは、送信する HTTP リクエストにあります。次の行を参照してください。

接続: キープアライブ、TE

これにより、反対側のサーバーに接続を維持するように指示します。

試す:

接続: 閉じる

そして何が起こるか見てください。

于 2012-08-22T19:36:31.193 に答える
0

編集:あなたの質問を読み違えました。これはハング動作の原因ではありませんがmsgpartsステートメントif ... break.append.

于 2012-08-22T19:41:43.037 に答える