我正在使用python套接字模块实现一个简单的Web代理。在将客户端的HTTP请求转发到服务器之后,我使用以下方法来读取响应:
def _read_response(self):
response = ''
while True:
(readable, _, error) = select.select([self.server], [], [self.server], 3)
if error:
break
if readable:
data = self.server.recv(BUFSIZE)
if not data: break
response += data
return response
上述代码似乎适用于大多数情况,但慢。我把这个问题缩小到了这一行:
data = self.server.recv(BUFSIZE)
当不再有任何数据需要接收时(数据==''),此调用最多需要20秒。
读取http响应的正确方法是什么?为什么对recv()的调用需要这么长时间?
答案 0 :(得分:0)
在阅读正文之前解析内容长度标题。 然后从服务器中只读取 content-length 字节。
您可能希望通过以下方式设置套接字的非阻塞模式:
socket.setblocking(flag)
或在套接字操作上设置超时:
socket.settimeout(value)