python 套接字处理保活请求

python socket handle keepalive request

我正在使用 python 编写一个简单的网络服务器,并向其发送请求。我使用 libevent 作为我的 http 客户端。但是每次我发送 keep-alive 请求时,http 连接在成功回调之前都有关闭回调。我认为这可能是 keep-alive 问题。这是我的 python(服务器)代码:

import socket

HOST, PORT = '', 8999

listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
listen_socket.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 60)
listen_socket.setsockopt(socket.SOL_TCP, socket.TCP_KEEPCNT, 4)
listen_socket.setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, 15)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print 'Serving HTTP on port %s ...' % PORT
while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(1024)
    print request

    http_response = """\
    HTTP/1.1 200 OK

    Hello, World!
    """

    client_connection.sendall(http_response)
    client_connection.close()

But every time I send a keep-alive request, ...

我认为您混淆了应用层 HTTP keep-alive 和传输层 TCP keep-alive。

HTTP keep-alive 客户端用于向服务器建议底层 TCP 连接应保持打开状态,以便客户端的进一步请求。但是服务器可能会拒绝并且您的服务器在处理客户端请求后明确关闭连接,即完成发送响应。除此之外,服务器发送响应的方式使得 HTTP keep-alive 不可能,因为响应的长度是未知的,因此仅在底层 TCP 连接结束时结束。要解决此问题,您需要指定 Content-length 或使用分块传输编码。

TCP keep alive 用于检测连接中断,即一侧崩溃、路由器死机或类似情况。除了名称相似外,它与 HTTP keep-alive 完全无关。它是用 setsockopt 设置的,这就是你正在做的。但是在 TCP keep-alive.

的情况下,没有可以显式发送的 keep-alive 请求。