HEAD请求的Python Socket HTTP 1.1保持活动

时间:2019-09-08 12:38:02

标签: python sockets http

对于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())

1 个答案:

答案 0 :(得分:1)

  

对于HTTP 1.1协议,连接是持久的(保持活动状态)

否,如果服务器也希望连接可以保持持久,则可以保持持久。如果客户端发出支持持久性的信号,则服务器可能决定立即关闭连接,此时间为5秒后,甚至永远不会自行关闭。

  

但是,没有Connection:close标头的情况下,用于HEAD请求的连接已关闭。

关闭连接的是您的客户端,而不是服务器。您的客户端只做一个recv,然后用套接字和程序来完成。如果有人修改代码以继续recv直到无法读取更多数据为止(类似于您的第二个程序),则客户端将挂起,因为服务器正在等待来自客户端的新请求。