PDA

Просмотр полной версии : Рекурсия при запросах к серверу


IDVsbruck
04.11.2007, 18:09
Нашел замечательный механизм - задержка ответа сервера при ajax-запросе (так называемый Continuation из Jetty, технология Comet) - когда ответ с сервера приходит при получении ожидаемого события (например, обновление информации только когда на страницу входит новый посетитель). Так как запрос асинхронный, флешка работает в нормальном режиме.

Вызов осуществляю вызовом функции:

function getStatus() {
var sendData = new LoadVars();
var loadData = new LoadVars();
loadData.onLoad = function(success: Boolean) {
if (success) {
if (loadData.param1 != undefined) lblParam1.text = loadData.param1;
if (loadData.param2 != undefined) lblparam2.text = loadData.param2;
getStatus();
}
}
sendData.userID = userID;
sendData.sessionID = sessionID;
sendData.recieveParameter = "get_status";
sendData.sendAndLoad("{path to my script}", loadData);
}


Можно ли таким образом делать постоянный опрос сервера? Допустима ли рекурсия в таком исполнении? (Просто я что-то такое слышал об ограничении флешем уровней рекурсии - может, это и бред, но когда приложение не работает и не можешь найти решения, то прислушиваешься уже ко всему).

Ну и еще такой вопрос: наверняка кто-то реализовывал на флеше реакцию на действия сервера не сокетом (к сожалению, мне он тут не подходит), а постоянным опросом сервера через, например, равные промежутки времени на предмет наличия изменений. В чистом html (или jsp) это сделать проще - ответом сервера служит скрипт с функцией повторного запроса - и следующий вызов происходит не из функции (она завершила свою работу - получила контент), а путем запуска скрипта из вновь полученного контента. А вот как это же реализовывают во флеше? - Если простой рекурсией, то нет ли переполнения стека? Не съедается ли память?

Большая благодарность за помощь или совет.

etc
04.11.2007, 18:23
Не мучайте сервер.

17777

DarkLight
04.11.2007, 18:36
Чтобы не бояться рекурсии, можно использовать setTimeout, но если юзеров будет много, серверу будет плохо....

IDVsbruck
04.11.2007, 23:44
Ну, если честно, то серверу по барабану ...
Согласно документации Jetty сервер может принять на себя одновременно 10700 конкурирующих запросов, при этом обрабатывая 5000 запросов в секунду. Стек памяти занимает при полной загрузке 57М. Если учесть, что под проект выделен отдельный сервер (без конкурирующих проектов), а даже очень загружающий мультигейминг ну никак не будет дотягивать до такого количества.

Кстати, сокеты будут тянуть больше ресурсов сервера. То есть в теории к серверу может подключиться бесконечное количество клиентов, но все знают, что такое ДДОС-атака (кажется, так), когда при большой загрузке порта, выделенного под сокет, ложится сервак.

А вот насчет setTimeout спасибо - как-то забыл про него.

7thsky™
05.11.2007, 02:28
Я вообще не понял где в вашем коде рекурсия (касательно флэша) так как там нету рекурсии то беспокоиться о 256 уровнях рекурсии не обязательно, насчет push'a.

Есть сервер lightstreamer (http://www.lightstreamer.com/) у них есть хорошая библиотека для клиента на аs2/as3 (жалко что они идут только с платными версиями).

В ас3 можно без труда реализовать comet через flash.net.URLStream (так например в лайтстриммер и реализованно), с ас2 трудней, но тоже реализуемо.

FourSide
06.11.2007, 12:14
Мне кажется, приведённый код работать вообще не будет.
Метод getStatus не описан в объекте loadData.