0

ご存知のように、データのサイズがわからない場合があります ( Content-Lengthhttp 応答ヘッダーにない場合)。

http応答データを受信する最良の方法は何ですか(ソケットを使用)?

次のコードはすべてのデータを取得できますが、でブロックされbuf = sock.recv(1024)ます。

from socket import *
import sys

sock = socket(AF_INET, SOCK_STREAM)
sock.connect(('www.google.com', 80))
index = "GET / HTTP/1.1\r\nHOST:www.google.com\r\nConnection:keep-alive\r\n\r\n"
bdsock.send(index)

data = ""
while True:
    buf = bdsock.recv(1024)
    if not len(buf):
        break
    data += buf
4

3 に答える 3

1

送信者も書いていると思います。

古典的なアプローチは、データの長さをネットワーク経由で送信されるすべてのデータにプレフィックスとして付けることです。受信側では、受信したすべてのデータを貪欲にバッファに追加し、新しいデータを受信するたびにバッファを反復処理します。

したがって、100 バイトのデータを送信する場合、パケットの先頭に int 100 のプレフィックスを付けて送信します。次に、受信者は探しているものを正確に認識します。凝ったものにしたい場合は\x00\x01\x02、パケットの適切な終了を示すような特別なエンドライン シーケンスを使用できます。これは、簡単に実装できる形式のエラー チェックです。

于 2013-10-16T15:48:04.020 に答える
-1

今日、また同じ質問を受けました。そして、簡単な方法はhttplibを使用することであることがわかりました。

r = HTTPResponse(sock)
r.begin()
# now you can use HTTPResponse method to get what you want.
print r.read()
于 2014-11-21T10:35:22.840 に答える