python套接字句柄keepalive请求

时间:2016-01-21 04:46:41

标签: python sockets http keep-alive libevent

我正在使用python编写一个简单的Web服务器,并向它发送请求。我使用 libevent 作为我的http客户端。但是每次发送 keep-alive 请求时,http连接都会在成功回调之前进行close回调。我认为这可能是保持活力的问题。这是我的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()

1 个答案:

答案 0 :(得分:3)

  

但每次发送保持活动请求时,......

我认为你正在混合应用程序层HTTP keep-alive和传输层TCP keep-alive。

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

TCP keep alive用于检测连接中断,即一方崩溃,路由器死亡或类似情况。除了相似的名称之外,它与HTTP keep-alive无关。它是用setsockopt设置的,这就是你在做什么。但是在TCP保持活动的情况下,没有可以显式发送的保持活动请求。