对于HTTP 1.1协议,连接是持久的(保持活动状态)。
客户端应发送Connection:close
标头属性以关闭连接。
在Python程序中,GET请求就是这种情况。但是,没有Connection:close
头的情况下,用于HEAD请求的连接已关闭。
出了什么问题?
我还测试了HEAD请求的Java版本,并且该连接在该处是持久的。
用于HEAD请求的Python程序:
#!/usr/bin/env python
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(("webcode.me" , 80))
s.sendall(b"HEAD / HTTP/1.1\r\nHost: webcode.me\r\nAccept: text/html\r\n\r\n")
print(str(s.recv(1024), 'utf-8'))
用于GET请求的Python程序:
#!/usr/bin/env python
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect(("webcode.me" , 80))
s.sendall(b"GET / HTTP/1.1\r\nHost: webcode.me\r\nAccept: text/html\r\nConnection: close\r\n\r\n")
# s.sendall(b"GET / HTTP/1.0\r\nHost: webcode.me\r\nAccept: text/html\r\n\r\n")
while True:
data = s.recv(512)
if not data:
break
print(data.decode())
答案 0 :(得分:1)
对于HTTP 1.1协议,连接是持久的(保持活动状态)
否,如果服务器也希望连接可以保持持久,则可以保持持久。如果客户端发出支持持久性的信号,则服务器可能决定立即关闭连接,此时间为5秒后,甚至永远不会自行关闭。
但是,没有Connection:close标头的情况下,用于HEAD请求的连接已关闭。
关闭连接的是您的客户端,而不是服务器。您的客户端只做一个recv
,然后用套接字和程序来完成。如果有人修改代码以继续recv
直到无法读取更多数据为止(类似于您的第二个程序),则客户端将挂起,因为服务器正在等待来自客户端的新请求。