0

As you know sometimes we can't know what the size of the data(if there is no Content-Length in http response header).

What is the best way to receive http response data(use socket)?

The follow code can get all the data but it will blocking at 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 前缀,然后进行传输。然后,接收者确切地知道它在寻找什么。如果你想变得花哨,你可以使用一个特殊的 endline 序列\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 回答
-1

首先使用更大的尺寸,做几个测试,然后看看这些缓冲区的长度是多少,然后你就会知道最大尺寸是多少。然后只需使用该数字 +100 左右即可确定。测试不同的场景将是您找到理想 buf 大小的最佳选择。了解您使用套接字的协议也将有所帮助,然后我们将为您提供更好的想法和响应。

于 2013-10-16T15:17:58.310 回答