如您所知,有时我们无法知道数据的大小(如果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
答案 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尺寸时,测试不同的场景将是您最好的选择。 它也有助于了解您使用套接字的协议,然后我们会为您提供更好的想法和响应。