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

Python 如何使用套接字接收http响应数据?,python,networking,protocol-buffers,recv,Python,Networking,Protocol Buffers,Recv,正如您所知道的,有时我们无法知道数据的大小(如果http响应头中没有内容长度) 接收http响应数据的最佳方式是什么(使用套接字) 下面的代码可以获取所有数据,但它将在buf=sock.recv(1024)处阻塞 首先使用一个更大的尺寸,做几个测试,然后看看这些缓冲区的长度,然后你就会知道最大尺寸是多少。然后用+100左右的数字来确定。 测试不同的场景将是找到理想buf大小的最佳选择。 了解您使用套接字的协议也会有所帮助,然后我们会为您提供更好的想法和响应。我假设您也在编写发送方 一种经典的方法

正如您所知道的,有时我们无法知道数据的大小(如果http响应头中没有
内容长度

接收http响应数据的最佳方式是什么(使用套接字)

下面的代码可以获取所有数据,但它将在
buf=sock.recv(1024)
处阻塞


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

我假设您也在编写发送方

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


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

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


如果您也在编写发件人代码,请使用标题系统。否则,您可以循环recv(),直到它返回一个空字符串(可能是None,但谁在乎它们都是假的)。这是http协议,我应该设置什么buf大小?我没有编写发送方,我使用http协议。一些网站返回没有
内容长度
属性,并且没有特殊的结束行序列。实际上这并不能回答问题。答案是HTTPResponse做了什么。
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
r = HTTPResponse(sock)
r.begin()
# now you can use HTTPResponse method to get what you want.
print r.read()