python socket句柄keepalive请求
问题描述:
我正在使用python写一个简单的web服务器,并向它发送请求。我使用libevent作为我的http客户端。但每次我发送保持活动请求时,http连接在成功回调之前都有关闭回调。我认为这可能是保持活力的问题。这是我的Python(服务器)代码:python socket句柄keepalive请求
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()
答
但每次我发送保活请求的时候,......
我想你混淆了应用层的HTTP保持 - 活动和传输层TCP保持活动。
客户端使用HTTP保持活动来向服务器建议底层TCP连接应该保持打开状态,以便来自客户端的进一步请求。但服务器可能会拒绝服务器,并且服务器在处理客户端请求后明确关闭连接,完成发送回复。除此之外,服务器以一种使HTTP保持活动不可能的方式发送响应的方式是不可能的,因为响应的长度未知,因此仅以底层TCP连接的结束结束。要解决这个问题,你需要指定一个内容长度或使用分块传输编码。
TCP保持活跃,而不是用于检测连接中断,即一方崩溃,路由器死亡或类似。除了类似的名称外,它与HTTP保持活动无关。它使用setsockopt设置,这就是你正在做的。但是,在TCP保持活动的情况下,不存在您可以明确发送的保持活动请求。
谢谢,我真的混淆了HTTP保持活动状态和TCP保持活动状态。我使用** BaseHTTPServer **解决了这个问题。但我仍然很好奇如何支持HTTP保持活动使用上面的代码。我试图添加**内容长度**和**连接**标题,但它仍然无法正常工作。 –
@XiaoyingWang:我不知道你是如何试图做到这一点的(没有代码),所以我无法帮忙。我建议用代码问一个新问题。 –