2016-01-21 8 views
0

Я использую python для написания простого веб-сервера и отправки ему запросов. И я использую libevent как мой клиент http. Но каждый раз, когда я отправляю запрос keep-alive, http-соединение имеет закрытый обратный вызов до успешного обратного вызова. Я думаю, что это может быть проблемой поддержания жизни. И это мой питон (сервер) Код:python socket handle keepalive request

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

Но каждый раз, когда я отправить запрос Keep-Alive, ...

Я думаю, что вы смешивая HTTP на уровне приложения держать -alive и транспортный уровень TCP keep-alive.

HTTP keep-alive используется клиентом для указания серверу, что базовое TCP-соединение должно оставаться открытым для дальнейших запросов от клиента. Но сервер может отказаться, и ваш сервер явно закрывает соединение после обработки запроса клиентов, т. Е. завершение отправки ответа. Помимо этого, сервер посылает ответ таким образом, который делает невозможным сохранение HTTP, потому что длина ответа неизвестна и, следовательно, заканчивается только концом базового TCP-соединения. Чтобы исправить это, вам нужно указать длину содержимого или использовать кодировку с коротким передачей.

TCP keep alive вместо этого используется для обнаружения разрыва соединения, то есть сбой одной стороны, роутер мертв или аналогичный. Он не связан с HTTP-сохранением вообще, за исключением аналогичного имени. Он устанавливается с помощью setockopt, и это то, что вы делаете. Но нет такой вещи, как запрос keep-alive, который вы можете явно отправить в случае сохранения TCP.

+0

Спасибо, я действительно перепутал HTTP keep-alive и TCP keep-alive. И я использую ** BaseHTTPServer **, решил проблему. Но мне все еще интересно, как поддерживать поддержку HTTP-содержимого с помощью вышеуказанного кода. Я попытался добавить ** Content-Length ** и ** Connection ** заголовки, но он по-прежнему не работает. –

+0

@ XiaoyingWang: Я понятия не имею, как вы пытались это сделать (без кода), поэтому я не могу помочь. Я рекомендую задать новый вопрос с кодом. –