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

2024-10-01 09:34:53 发布

您现在位置:Python中文网/ 问答频道 /正文

如您所知,有时我们无法知道数据的大小(如果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

Tags: 数据importcomhttpdataindexwwwgoogle
3条回答

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

我想你也在给发信人写信。在

一种典型的方法是用数据的长度作为通过线路发送的任何数据的前缀。然后贪婪地将接收到的数据附加到缓冲区中,然后在每个缓冲区接收到新的数据。在

所以,如果我发送100字节的数据,我会在包的开头加一个int100前缀,然后再发送。然后,接收器就知道它在寻找什么。{end1>表示一个特殊的序列,如果你想得到一个特殊的序列。这是一种易于实现的错误检查形式。在

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

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

相关问题 更多 >