|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||||||
Ожидание ответа сервера01.04.2019, 22:18. Показов 12768. Ответов 30
Метки нет (Все метки)
Возникла необходимость на html-странице автоматически отправлять запрос серверу через определённые интервалы времени.
Сделал скрипт:
Можно ли в скрипте как-то указать, чтобы клиент сначала дождался неполученного ответа, а затем выполнял document.location.search = 'auto' ?
0
|
||||||
| 01.04.2019, 22:18 | |
|
Ответы с готовыми решениями:
30
Ожидание сообщений от сервера Парсинг ответа сервера ajax |
|
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
|
|
| 02.04.2019, 07:33 | |
|
LVV, а сам запрос к серверу как отправляется?
0
|
|
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||
| 02.04.2019, 11:30 [ТС] | ||
|
От клиента сервер получает следующий запрос: GET /auto HTTP/1.1 Host: ................................... Connection: keep-alive User-Agent:........................... Accept:................................. Referer:................................ ........................................ ............. и отправляет такой ответ: HTTP/1.1 204 No Content (ответ без контента, чтобы в браузере не менялась страничка) Автозапросы мне нужны для определения сервером активности клиента (в сети он, или нет). Всё работает. Но, с клиентской странички пользователем могут быть отправлены и другие GET-запросы (нажатием кнопки, ссылки и т.п.). И, если во время обработки такого клиентского запроса (до получения ответа сервера) происходит передача скриптом автозапроса, то предыдущий ответ сервера "теряется". Вот я и спрашиваю, можно ли как-то проконтролировать, получил ли клиент ответ на свой предыдущий запрос, или нет? И, в зависимости от этого отправлять автозапрос, или ждать.
0
|
||
|
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
|
|||||||
| 02.04.2019, 14:04 | |||||||
Сообщение было отмечено LVV как решение
Решение
1
|
|||||||
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||||||
| 03.04.2019, 12:25 [ТС] | ||||||
|
Спасибо, atanov.
В моём случае это, наверное, будет выглядеть примерно так:
Ведь у меня клиентский запрос обрабатывается на сервере средствами С++.
0
|
||||||
|
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
|
|||
| 03.04.2019, 12:40 | |||
|
LVV, а куда выведет
0
|
|||
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||||||||||||
| 03.04.2019, 18:55 [ТС] | ||||||||||||
|
На примитивном уровне это выглядит примерно так:
И так многократно. Я просто смотрю, что там содержится в запросе, и соответственно реагирую. Например, document.location.search = 'auto'; генерирует в запросе клиента строку GET /auto HTTP/1.1 и тогда клиенту отправится сообщение HTTP/1.1 204 No Content, а в базе данных на стороне сервера отмечется, что такой-то клиент в такое-то время был в сети. А если в запросе присутствует GET / HTTP/1.1 то ответ сервера будет с заголовком HTTP/1.1 200 OK и html-контентом главной страницы. И т.п. Наверное, не так уж и важно, чтот там написано вместо 'название скрипта-обработчика'. Мне главное, чтобы сервер регулярно получал от клиента автозапрос. И чтобы этот автозапрос не мешал пользовательским запросам. Но с таким скриптом в теле html-страницы:
Хотя по идее должны отправляться каждые пять секунд.
0
|
||||||||||||
|
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
|
||
| 03.04.2019, 19:12 | ||
|
LVV, нет, не верно.
Вообще прелесть сокета в неразрываемом соединении. Ну да ладно. А вот Дальше - функция statusReady() когда статус запроса 4, т.е. обработан сервером и получен ответ. Т.е. в Вашем случае, без обработчика, условие в стр. 6 всегда будет false. Вот здесь почитайте, что ждёт XMLHttpRequest() https://learn.javascript.ru/ajax-xmlhttprequest. Кстати, Вы попробуйте в качестве обработчика запускать Ваш кусок кода (в отдельном модуле, конечно), только сообщайте ответ сервера. Тогда и функция сработает как положено. Только уберите 13-ю строку.
1
|
||
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|||||
| 03.04.2019, 20:21 [ТС] | |||||
|
closesocket(client_socket); и устанавливается соединение с другим: client_socket = accept(........) ну да ладно ![]() В нём нет отдельных модулей. Весь сервер - это (после компиляции проекта) один exe-файл плюс база данных. Мне нужно, чтобы html-страничка регулярно отправляла автозапрос на сервер. Иначе как я буду знать, находится клиент в сети или нет?
0
|
|||||
|
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
|
|||||||||||||||||
| 04.04.2019, 07:37 | |||||||||||||||||
|
Попробуйте так:
119.php это название обработчика - замените на свой. Поместите в браузер html и откройте консоль браузера, чтобы видеть возможные ошибки. Раз в 5 секунд в див должен добавляться очередной ответ сервера. И ещё - интервал первый раз 5 сек отсчитает от момента загрузки содержимого html. А потом будет отсчитывать от момента ответа сервера.
1
|
|||||||||||||||||
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
|
| 04.04.2019, 10:13 [ТС] | |
|
Спасибо, atanov, за участие... Разбираюсь.
0
|
|
|
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554
|
|
| 04.04.2019, 10:39 | |
|
1
|
|
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||||||||
| 06.04.2019, 14:29 [ТС] | ||||||||
|
Если бы это помогло решить проблему, то можно было бы создать какой-то скрипт-пустышку для заполнения параметра URL в XMLHttpRequest. Попробовал... не помогло. На этот? sendInfo.open('GET', '119.php', true); sendInfo.send(); atanov, если я правильно разобрался в идее Вашего кода, то он должен регулярно генерировать запросы, но каждый следующий запрос генерируется только в том случае, если получен ответ на предыдущий сгенерированный скриптом запрос. Но это не совсем то, чего хотел я. Еще раз сформулирую проблему: Например, имеется такая html-страничка:
который он обрабатывает, например, две секунды, чтобы послать ответ: HTTP/1.1 200 OK................. Но в течении этих двух секунд та же страничка успеет отправить следующий автозапрос: GET /auto HTTP/1.1 на который сервер ответит: HTTP/1.1 204 No Content. И это произойдёт раньше, чем обработается запрос по ссылке. Таким образом, до клиента не дойдёт ответ 200 OK а только лишь 204 No Content. Вот я и хочу сделать так, чтобы браузер дожидался ответа на любой запрос (а не только сгенерированный автоматически), и лишь после этого отправлял свой автозапрос. То есть, чтобы автозапросы не мешали пользователю работать с web-страничкой.
0
|
||||||||
|
566 / 465 / 183
Регистрация: 14.10.2017
Сообщений: 1,259
|
||
| 06.04.2019, 15:05 | ||
|
1
|
||
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||
| 06.04.2019, 16:24 [ТС] | ||
|
С одной стороны - сервер, с другой - браузер. И как Вы представляете в таком случае, обработку сервером запросов, например, от 1000-ти клиентов? 1000 - одновременных соединений? Связь с клиентом прекращается сразу после отправки сервером ему ответа. После этого устанавливается связь с другим клиентом, приславшим запрос и т.д. Если пользователь закроет страничку, или оборвётся связь, то сервер об этом не узнает, так как никакого запроса не получит. Добавлено через 2 минуты Клиент может быть в сети, но не проявлять активности. Пользователь может длительное время не нажимать никаких кнопок и ссылок... но оставаться в сети. Вот для этого и нужны автозапросы, чтобы узнать открыта ли страничка на стороне клиента или нет (в сети клиент или нет).
0
|
||
|
566 / 465 / 183
Регистрация: 14.10.2017
Сообщений: 1,259
|
|||
| 06.04.2019, 17:36 | |||
|
1
|
|||
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||
| 06.04.2019, 17:44 [ТС] | ||
|
Или дайте ссылку, где почитать об этом...
0
|
||
|
13440 / 7534 / 830
Регистрация: 09.09.2009
Сообщений: 29,554
|
|
| 06.04.2019, 17:55 | |
|
не могу сказать, что сильно вникал в вашу задачу, но у XMLHttpRequest есть параметр "async", и почему то мне кажется что вам нужно использовать его,чтобы яваскрипт дожидался ответа на предыдущийответ и (например) снимал бы какой-нибуть флаг. а перед запуском нового запроса проверял его состояние.
1
|
|
|
566 / 465 / 183
Регистрация: 14.10.2017
Сообщений: 1,259
|
|||||||
| 06.04.2019, 18:16 | |||||||
|
Но точно знаю что сокеты поддерживают все нормальные сервера на всех языках А вы сами читали материал по приведенной ссылке? Там есть несколько пунктов про сокеты, может это оно и есть? Добавлено через 9 минут LVV, ну бегло так заглянул в раздел Получение запроса и отправка ответа :После установки соединение с сервером, браузер отправляет HTTP-запрос. Мы получаем содержимое запроса через функцию recv. Она принимает дескриптор TCP-соединения (в нашем случае это client_socket), указатель на буфер для сохранения полученных данных, размер буфера в байтах и дополнительные флаги (которые сейчас нас не интересуют).При успешном выполнении функция recv вернет размер полученных данных. В случае ошибки возвращается значение SOCKET_ERROR. Если соединение было закрыто клиентом, то возвращается 0. Мы создадим буфер размером 1024 байта для сохранения HTTP-запроса. И далее пример кода Кликните здесь для просмотра всего текста
0
|
|||||||
|
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
|
||
| 06.04.2019, 19:02 [ТС] | ||
|
closesocket(client_socket); Соединение с клиентом закрыто, и ожидается очередной запрос (не обязательно от этого же клиента). А соединения с первым клиентом нет, значит и о закрытии им странички сервер не узнает! Добавлено через 3 минуты Проблема не в создании сервера и его работе. У меня всё создано и всё работает. Мне нужно определить кто из клиентов находится в сети. Логины клиентов сервер прописал в куках. Поэтому, получая регулярные автозапросы с куками я могу знать кто именно еще не закрыл страничку. Проблема в том, что автозапросы при совпадении во времени мешают обычным пользовательским запросам клиента.
0
|
||
| 06.04.2019, 19:02 | |
|
Помогаю со студенческими работами здесь
20
Не понятный формат данных ответа сервера Как получить код ответа сервера? Почему XmlHttpRequest не выводит alert с кодом ответа сервера?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|