2016-01-21 88 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:我不知道你是如何試圖做到這一點的(沒有代碼),所以我無法幫忙。我建議用代碼問一個新問題。 –