Найти - Пользователи
Полная версия: соединение по http connection keep-alive, как прочесть данные?
Начало » Python для новичков » соединение по http connection keep-alive, как прочесть данные?
1
Alex-111
Идет общение с сервером по http, при соединении в режиме “connection: close”, все нормально,
сначала посылаем запрос - socket.write, после чего - socket.read читаем ответ, все работает.
Но требуется держать соединение постоянно, и при установке заголовка http “connection: keep_alive”, read() читает данные и, похоже, прочтя ответ - зависает. Ну и через минуту отваливается по тайм-ауту.
Как сделать чтобы выполнение шло дальше? Может флажок какой? Гуглю, пока не увидел ответа.
py.user.next
python.org. socket. timeout
Попробуй вызвать у сокета метод и передать в него None.
Alex-111
py.user.next
python.org. socket. timeoutПопробуй вызвать у сокета метод и передать в него None.
виснет как и раньше.
Поставил timeout 2 сек, отработало как минимум раз (дальше не гнал, там еще код переделывать) как и с connection:close,
но это же ужас, юзать такое, нет?
py.user.next
Alex-111
Но требуется держать соединение постоянно, и при установке заголовка http “connection: keep_alive”, read() читает данные и, похоже, прочтя ответ - зависает.
Так тебе нужно что? Чтобы он зависал и ждал данных или чтобы он брал все данные, которые пришли, и сразу отключался (не ждал дальше ничего) и работал с этими данными?

Если тебе нужно, чтобы он не ждал ничего, то тебе нужен неблокирующий сокет. И суть сводится к тому, что ты его постоянно опрашиваешь на появление данных. Делаешь это через select() или poll(). И лучше почитать что-нибудь на этот счёт, прежде чем этим заниматься, потому что так просто ты эту всю систему не сообразишь.
Alex-111
py.user.next
Так тебе нужно что? Чтобы он зависал и ждал данных или чтобы он брал все данные, которые пришли, и сразу отключался (не ждал дальше ничего) и работал с этими данными?

надо: послал запрос - прочел ответ, и держим соединение пока не решим повторить.
пока хватит этого.
Только если использовать скажем time.sleep() более пары десятков секунд, для создания паузы между запросами, соединение перестает работать. Наверное там каждые N секунд идет какой-то пинг, а sleep его блокирует и сервер считает что соединение разорвано.

FishHook
Alex-111
Только если использовать скажем time.sleep() более пары десятков секунд, для создания паузы между запросами, соединение перестает работать. Наверное там каждые N секунд идет какой-то пинг, а sleep его блокирует и сервер считает что соединение разорвано.
В асинхронном коде нельзя использовать time.sleep
Ваш подход вообще в корне неверен. Попоробуйте не изобретать велосипед, а воспользоваться каким-нибудь асинхронным фреймворком, например, https://docs.aiohttp.org/en/v2.3.4/
Alex-111
time.sleep используется между запросами, по идее это мешать не должно. Ну только если как-то в фоновом режиме идет пинг от сокета. Для чего-то же устанавливают параметры TCP -
        #  Set TCP keepalive on an open socket.
        #  It activates after 1 second (TCP_KEEPIDLE,) of idleness,
        #  then sends a keepalive ping once every 3 seconds (TCP_KEEPINTVL),
        #  and closes the connection after 5 failed ping (TCP_KEEPCNT), or 15 seconds
        try:
            from socket import IPPROTO_TCP, SO_KEEPALIVE, TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_KEEPCNT
            s.setsockopt(socket.SOL_SOCKET, SO_KEEPALIVE, 1)
            s.setsockopt(IPPROTO_TCP, TCP_KEEPIDLE, 1)
            s.setsockopt(IPPROTO_TCP, TCP_KEEPINTVL, 3)
            s.setsockopt(IPPROTO_TCP, TCP_KEEPCNT, 5)

фреймворк не могу, код уже написан, остается только править.
py.user.next
Alex-111
надо: послал запрос - прочел ответ, и держим соединение пока не решим повторить.
Посылай ложный запрос. Один запрос ты посылаешь, получаешь на него ответ и читаешь ответ. А потом ты посылаешь сразу второй запрос и не читаешь на него ответ. Таким образом ты поддерживаешь соединение, а работаешь только с теми данными из ответа, которые в первый раз получаешь.

Сервер разрывает соединение, когда понимает, что тебя нет. Вот тебе нужно показывать, что ты есть.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB