2016-01-21 246 views
0

我正在使用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() 

回答

3

但每次我发送保活请求的时候,......

我想你混淆了应用层的HTTP保持 - 活动和传输层TCP保持活动。

客户端使用HTTP保持活动来向服务器建议底层TCP连接应该保持打开状态,以便来自客户端的进一步请求。但服务器可能会拒绝服务器,并且服务器在处理客户端请求后明确关闭连接,完成发送回复。除此之外,服务器以一种使HTTP保持活动不可能的方式发送响应的方式是不可能的,因为响应的长度未知,因此仅以底层TCP连接的结束结束。要解决这个问题,你需要指定一个内容长度或使用分块传输编码。

TCP保持活跃,而不是用于检测连接中断,即一方崩溃,路由器死亡或类似。除了类似的名称外,它与HTTP保持活动无关。它使用setsockopt设置,这就是你正在做的。但是,在TCP保持活动的情况下,不存在您可以明确发送的保持活动请求。

+0

谢谢,我真的混淆了HTTP保持活动状态和TCP保持活动状态。我使用** BaseHTTPServer **解决了这个问题。但我仍然很好奇如何支持HTTP保持活动使用上面的代码。我试图添加**内容长度**和**连接**标题,但它仍然无法正常工作。 –

+0

@XiaoyingWang:我不知道你是如何试图做到这一点的(没有代码),所以我无法帮忙。我建议用代码问一个新问题。 –