Python套接字HTTP 1.1对HEAD请求保持活动状态

Python套接字HTTP 1.1对HEAD请求保持活动状态,python,sockets,http,Python,Sockets,Http,对于HTTP 1.1协议,连接是持久的(保持活动)。 客户端应发送Connection:close头属性以关闭连接。 在Python程序中,GET请求就是这种情况。但是,头请求的连接在没有连接:close头的情况下关闭 问题是什么 我还测试了HEAD请求的Java版本,并且连接在那里是持久的 用于HEAD请求的Python程序: #!/usr/bin/env python import socket with socket.socket(socket.AF_INET, socket.SOCK

对于HTTP 1.1协议,连接是持久的(保持活动)。 客户端应发送
Connection:close
头属性以关闭连接。 在Python程序中,GET请求就是这种情况。但是,头请求的连接在没有
连接:close
头的情况下关闭

问题是什么

我还测试了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())
对于HTTP 1.1协议,连接是持久的(保持活动状态)

否,如果服务器也希望连接保持不变,则连接可以保持不变。服务器可能会在…5秒后决定立即关闭连接。。。如果客户机发出支持持久性的信号,那么它甚至永远不会自己发出信号

但是,HEAD请求的连接在没有connection:close header的情况下关闭


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

如果没有数据,则
是否冗余?我认为在最后可能会发送一个空字符串,表示通信结束,这将终止循环。@JanBodnar:“空字符串”不能通过TCP发送,因为TCP是一个字节流,即至少有一个字节(一些数据,即不是空字符串),或者没有字节(没有数据,即没有要发送的内容)。要找出HTTP消息的结束位置,您需要解析标准中定义的HTTP协议,即首先读取HTTP头并从其内容确定HTTP正文的结束位置。这绝非小事,而不仅仅是一个简单的
recv