<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">28 апреля 2014 г., 10:27 пользователь Ivan Petrov <span dir="ltr"><<a href="mailto:i.petro.77.00@gmail.com" target="_blank">i.petro.77.00@gmail.com</a>></span> написал:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="">> Судя по вашему описанию, клиент ведёт себя неадекватно. При реконнекте не<br>
> должно идти много соединений. Вы должны инициировать соединение с сервером, у<br>
> него есть таймаут, скажем 30 секунд. Если в течение этого времени ничего не<br>
> пришло, клиент делает XMLHttpRequest.abort и только потом инициирует новое<br>
> соединение. Никаких 30 одновременно никак не получится.<br>
<br>
</div>Вы видимо вообще с лонгпулингом не работали?<br></blockquote><div><br></div><div>Не, работал и много. Браузерные игры делал.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
да примерно так и работает, здесь речь идет уже о том что происходит<br>
ПОСЛЕ XMLHttpRequest.abort.<br>
<br>
а после происходят повторные попытки.<br></blockquote><div><br></div><div>Верно.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
если повторная попытка удачная, то клиент в результате этой удачи<br>
получает все сообщения накопившиеся "для него" за время пока шли<br>
попытки переустановить соединение.<br></blockquote><div><br></div><div>Верно. Вся пачка будет доставлена за один запрос, который последует за обрывом связи.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
ну и вообще смысл работы любого сервера лонгпулинга - хранить<br>
сообщения для клиентов пока те реконнектятся.<br>
если бы не было реконнектов, то получился бы вебсокет.<br></blockquote><div><br></div><div>Верно. Точнее, есть ещё таймаут на стороне сервера, который заставит сервер "забыть" клиента, если он надолго отвалился. И тогда после реконнекта клиент получит уведомление, что его сессия протухла, и надо загрузить всё состояние приложения заново.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">далее получается что поскольку с лонгпулингом мы таким образом можем<br>
получить сразу большой пакет событий, то уже *в обработке* этих<br>
событий получается:<br>
<br>
- если событие приводит скажем к изменению цвета кнопки - тут все<br>
просто<br>
- если событие рождает AJAX запрос, то вот тут начинаются проблемы. ибо в некоторых случаях может получаться пакет AJAX запросов.<br></blockquote><div><br></div><div>А зачем событию рождать AJAX запрос? Я не очень знаю, что у вас за приложение, но, вероятно, этого как раз можно избежать. Если надо запросить 30 дополнительных объектов, то может это сделать одним запросом на сервер? Или доставить их прямо внутри лонгполл-ответа?</div>
<div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">вопрос состоит в том что либо мы *в конкретном приложении* придумываем<br>
некие критерии как эти запросы обрабатывать пакетно,<br>
либо видимо можно сформулировать некоторый общий критерий, обобщенную<br>
реакцию самого клиента lp на такие события, как задержки.<br>
<br>
я вопрос тут описал как раз на тему может кто-то продумывал сие на<br>
общеконцептуальном, архитектурном уровне</blockquote><div><br></div><div>Я так делаю:</div><div>Когда клиент присоединяется, ему приходит через лонгполл "состояние мира". В играх это текущая локация, список объектов на локации, их координаты. Когда состояние объекта меняется (персонаж передвигается, например), всем подключенным клиентам в той же локации рассылается сообщение "объект 123 движется по траектории 5,7,4,2,6,7,3,2". Каждое сообщение маркируется тегом, в данном случае это будет 123.coord. Если какой-то клиент ещё не успел выгрести предыдущее сообщение с тем же тегом, то старое заменяется новым. Такие образом, после таймаута клиент не получит 100500 пропущенных перемещений, а только самое свежее.</div>
<div>Если же клиент отваливается очень надолго, то через несколько минут сервером фиксируется таймаут, а персонажа выкидывает из игры. Если соединение восстановилось, то сервер обрабатывает событие "игрок вошёл в игру", на клиент посылается пакет "очистить всё", а затем полный перечень всеъ объектов на локации и т.д, как будто новый клиент подключился.</div>
</div><br></div></div>