如何使用套接字接收http响应数据?

时间:2013-10-16 15:07:58

标签: python networking protocol-buffers recv

如您所知,有时我们无法知道数据的大小(如果http响应头中没有Content-Length)。

接收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

3 个答案:

答案 0 :(得分:1)

我假设你也在写发件人。

一种经典的方法是将通过线路发送的任何数据加上数据长度的前缀。在接收端,您只需将收到的所有数据附加到缓冲区,然后在每次接收到新数据时迭代缓冲区。

因此,如果我发送100个字节的数据,我会将int 100作为数据包开头的前缀,然后发送。然后,接收器确切地知道它正在寻找什么。如果您想获得想象力,可以使用像\x00\x01\x02这样的特殊结束序列来指示数据包的正确结束。这是一种易于实现的错误检查形式。

答案 1 :(得分:0)

今天我又回到了同样的问题。 我发现简单的方法是使用httplib

r = HTTPResponse(sock)
r.begin()
# now you can use HTTPResponse method to get what you want.
print r.read()

答案 2 :(得分:-1)

首先使用更大的尺寸,进行几项测试,然后看看这些缓冲区的长度是什么,然后您将了解最大尺寸是多少。然后只需使用该数字+100左右即可。 在找到理想的buf尺寸时,测试不同的场景将是您最好的选择。 它也有助于了解您使用套接字的协议,然后我们会为您提供更好的想法和响应。