Форум сайта python.su
0
Идет общение с сервером по http, при соединении в режиме “connection: close”, все нормально,
сначала посылаем запрос - socket.write, после чего - socket.read читаем ответ, все работает.
Но требуется держать соединение постоянно, и при установке заголовка http “connection: keep_alive”, read() читает данные и, похоже, прочтя ответ - зависает. Ну и через минуту отваливается по тайм-ауту.
Как сделать чтобы выполнение шло дальше? Может флажок какой? Гуглю, пока не увидел ответа.
Офлайн
857
python.org. socket. timeout
Попробуй вызвать у сокета метод и передать в него None.
Офлайн
0
py.user.nextвиснет как и раньше.
python.org. socket. timeoutПопробуй вызвать у сокета метод и передать в него None.
Офлайн
857
Alex-111Так тебе нужно что? Чтобы он зависал и ждал данных или чтобы он брал все данные, которые пришли, и сразу отключался (не ждал дальше ничего) и работал с этими данными?
Но требуется держать соединение постоянно, и при установке заголовка http “connection: keep_alive”, read() читает данные и, похоже, прочтя ответ - зависает.
Отредактировано py.user.next (Авг. 6, 2020 23:44:09)
Офлайн
0
py.user.next
Так тебе нужно что? Чтобы он зависал и ждал данных или чтобы он брал все данные, которые пришли, и сразу отключался (не ждал дальше ничего) и работал с этими данными?
Офлайн
568
Alex-111В асинхронном коде нельзя использовать time.sleep
Только если использовать скажем time.sleep() более пары десятков секунд, для создания паузы между запросами, соединение перестает работать. Наверное там каждые N секунд идет какой-то пинг, а sleep его блокирует и сервер считает что соединение разорвано.
Офлайн
0
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)
Офлайн
857
Alex-111Посылай ложный запрос. Один запрос ты посылаешь, получаешь на него ответ и читаешь ответ. А потом ты посылаешь сразу второй запрос и не читаешь на него ответ. Таким образом ты поддерживаешь соединение, а работаешь только с теми данными из ответа, которые в первый раз получаешь.
надо: послал запрос - прочел ответ, и держим соединение пока не решим повторить.
Офлайн