sock.recv () занимает слишком много времени для выполнения в коде Python - PullRequest
0 голосов
/ 23 марта 2012

Ниже приведен код, который прослушивает порт для HTTP-запросов и отправляет пакет запроса на сервер, работающий на порту 80, получает ответ и отправляет данные обратно клиенту. Теперь все выполняется нормально, но следующая строка кода:

data = req_soc.recv(1024)

занимает слишком много времени для выполнения, и я заметил, что это занимает много времени для выполнения, когда он собирается / получил последний пакет. Я также пробовал тот же код, используя select.select(), но результаты те же. Поскольку я хочу обрабатывать данные (необработанные), поступающие от клиента и реального HTTP-сервера, у меня нет другого выбора, кроме как использовать сокеты.

import socket
import thread

def handle_client(client):
    data = client.recv(512)
    request = ''
    request += data
    print data

print '-'*20
spl = data.split("\r\n")

print spl[0]
print spl[1]

if len(request):
    req_soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    req_soc.connect(('localhost', 80))
    req_soc.send(request)

    response = ''
    data = req_soc.recv(1024)
    while data:
        response += data
        print 1
        data = req_soc.recv(1024)
    req_soc.close()
    print response
    if len(response):
        client.send(response)
client.close()

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('localhost', 4422))
server.listen(5)

print("Server is running...\n")

MSGLEN = 1024

while 1:

    client, address = server.accept()
    thread.start_new_thread(handle_client, (client, ))

1 Ответ

0 голосов
/ 23 марта 2012

Клиенты могут выполнять несколько команд (например, GET) в пределах одного соединения.Вы не можете ждать, пока клиент отправит все команды, потому что в зависимости от того, что вы вернете, он может запросить больше (например, изображения веб-страницы).Вы должны проанализировать части (команды) запроса, найти границу, переслать этот запрос на сервер и записать ответ клиенту.Все это таким образом, чтобы не блокировать чтение клиента.

Я не уверен, каков наилучший способ сделать это в python , но если вы потратите 5 минут на поиск в GoogleВы найдете идеальную библиотеку HTTP-прокси.

...