【发布时间】:2021-12-31 21:51:13
【问题描述】:
我正在用 Python 编写一个非常简单的客户端,它从 WWW 获取 HTML 页面。这是我到目前为止提出的代码:
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("www.mywebsite.com", 80))
sock.send(b"GET / HTTP/1.1\r\nHost:www.mywebsite.com\r\n\r\n")
while True:
chunk = sock.recv(1024) # (1)
if len(chunk) == 0:
break
print(chunk)
sock.close()
问题是:作为一个默认的 HTTP/1.1 连接,代码卡在# (1) 等待传输结束后来自服务器的更多数据。
我知道我可以通过 a) 添加 Connection: close 请求标头或 b) 为套接字设置超时来解决此问题。此处的非阻塞套接字无济于事,因为select() 系统调用仍会挂起(除非我对其设置超时,但这只是另一种形式的情况 b)。
那么有没有另一种方法可以做到这一点,同时保持连接持久?
【问题讨论】:
-
您根本没有解析响应以知道它何时真正结束。请参阅 RFC 2616 Section 4.4 和 RFC 7230 Section 3.3.3。然后,您可以在响应结束和您想在同一连接上发送新请求之间做任何您想做的事情。此外,您需要检查
Connection: close标头或Keep-Alive标头,指示连接超时和/或每个连接允许的最大请求数。 -
@RemyLebeau 如此解析响应标头,特别是
Content-Length似乎是要走的路。 -
解析不仅仅涉及标题。请阅读我提到的 RFC,不仅仅是处理
Content-Length。请参阅我的past answers 关于这个主题
标签: python http sockets networking network-programming