Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 6, 2020 12:28:11

Alex-111
Зарегистрирован: 2020-08-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

соединение по http connection keep-alive, как прочесть данные?

Идет общение с сервером по http, при соединении в режиме “connection: close”, все нормально,
сначала посылаем запрос - socket.write, после чего - socket.read читаем ответ, все работает.
Но требуется держать соединение постоянно, и при установке заголовка http “connection: keep_alive”, read() читает данные и, похоже, прочтя ответ - зависает. Ну и через минуту отваливается по тайм-ауту.
Как сделать чтобы выполнение шло дальше? Может флажок какой? Гуглю, пока не увидел ответа.

Офлайн

#2 Авг. 6, 2020 13:14:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

соединение по http connection keep-alive, как прочесть данные?

python.org. socket. timeout
Попробуй вызвать у сокета метод и передать в него None.



Офлайн

#3 Авг. 6, 2020 14:57:23

Alex-111
Зарегистрирован: 2020-08-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

соединение по http connection keep-alive, как прочесть данные?

py.user.next
python.org. socket. timeoutПопробуй вызвать у сокета метод и передать в него None.
виснет как и раньше.
Поставил timeout 2 сек, отработало как минимум раз (дальше не гнал, там еще код переделывать) как и с connection:close,
но это же ужас, юзать такое, нет?

Офлайн

#4 Авг. 6, 2020 23:43:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

соединение по http connection keep-alive, как прочесть данные?

Alex-111
Но требуется держать соединение постоянно, и при установке заголовка http “connection: keep_alive”, read() читает данные и, похоже, прочтя ответ - зависает.
Так тебе нужно что? Чтобы он зависал и ждал данных или чтобы он брал все данные, которые пришли, и сразу отключался (не ждал дальше ничего) и работал с этими данными?

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



Отредактировано py.user.next (Авг. 6, 2020 23:44:09)

Офлайн

#5 Авг. 10, 2020 15:26:13

Alex-111
Зарегистрирован: 2020-08-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

соединение по http connection keep-alive, как прочесть данные?

py.user.next
Так тебе нужно что? Чтобы он зависал и ждал данных или чтобы он брал все данные, которые пришли, и сразу отключался (не ждал дальше ничего) и работал с этими данными?

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

Офлайн

#6 Авг. 10, 2020 16:57:06

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

соединение по http connection keep-alive, как прочесть данные?

Alex-111
Только если использовать скажем time.sleep() более пары десятков секунд, для создания паузы между запросами, соединение перестает работать. Наверное там каждые N секунд идет какой-то пинг, а sleep его блокирует и сервер считает что соединение разорвано.
В асинхронном коде нельзя использовать time.sleep
Ваш подход вообще в корне неверен. Попоробуйте не изобретать велосипед, а воспользоваться каким-нибудь асинхронным фреймворком, например, https://docs.aiohttp.org/en/v2.3.4/



Офлайн

#7 Авг. 10, 2020 17:27:26

Alex-111
Зарегистрирован: 2020-08-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

соединение по http connection keep-alive, как прочесть данные?

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)

фреймворк не могу, код уже написан, остается только править.

Офлайн

#8 Авг. 11, 2020 00:22:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

соединение по http connection keep-alive, как прочесть данные?

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

Сервер разрывает соединение, когда понимает, что тебя нет. Вот тебе нужно показывать, что ты есть.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version