|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Mar 2010
Сообщений: 100
|
Как правильно делать запросы к серверу.
Вопрос попробую описать с примера.
Допустим есть приложение, которое отправляет запросы на сервер. Есть некий запрос ПИНГ, который формируется по таймеру, например раз в 5 секунд (не важно). Но при этом есть запросы, типа, найти пользователя, удалить пользователя, коннект пользователя и т.д. Эти запросы отправляются когда приспичет. Но может возникнуть ситуация, когда ПИНГ и ,например, НАЙТИ ПОЛЬЗОВАТЕЛЯ, будут отправляться одновременно, в результате один запрос пропадает (один обработчик ответа от сервера на все). Как правильно выполнять запросы ? Как Вы решаете такие вещи ? Как правильно делать запросы к серверу ? |
|
|||||
Не совсем понятно как это происходит. Видимо есть провтыки в логике приложения. Но уж нельзя контролировать очередь запросов к серверу, то в крайнем случае внесите переменную типа: "сервер занят". Если занят значит ждем ответа и только потом отправляем.
Или другой вариант, покрасивее: Делаете стек запросов, а далее пушите их по-очереди. как-то так: var requests:Vector.<URLRequest> = new Vector.<URLRequest>(); var currLoader:URLLoader; addEventListener("req_added", sendReq); //****************** // далее функция которая добавляет реквесты в стек //****************** private function addReq(req:URLRequest):void { requests.unshift(req); // добавили элемент в начало ибо брать мы их будем с конца this.dispatchEvent(new Event("req_added")); } /*примерно так добавляем запросы в очередь*/ addReq(new URLRequest("блаблабла запрос")); //----------------------------------- //******************** // далее слушатель //******************** private function sendReq(e:Event):void { if ( !currLoader && requests.length) {// проверяем свободен ли лоадер, // и есть ли необратанные запросы, // если да и да то посылаем запрос иначе просто игнорим var req:URLRequest = requests.pop(); currLoader.addEventListener(Event.COMPLETE, loaded); currLoader = new URLLoader(req); } } private function loaded(e:Event):void { /*делаем что там надо с полученными результатами и обнуляем лоадер * * someOperations(); * * Вероятно эти операции могут выполняться не зависимо от лоадера * тогда лучше сначала проводить сохранение результатов запроса в куда-то, * обнуление лоадера, а уже потом обработку результатов * */ currLoader = null; // обнуляем (освобождаем) лоадер sendReq(null); // а вот собственно поэтому надо было игнорить выше, // ибо функция вызывается не только по ивенту, // а и мануально при освобождении лоадера // лоадер освободился и мы не дожидаясь следующего диспатча // проверяем остались ли запросы в очереди. } Добавлено через 3 минуты Можно сделать еще красивее, но кода будет больше. Хотя и универсальнее получится. Диспатчей накрутить еще парочку, например: "лоадер_освободился" и в таком духе. |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Вообще это надо умудриться сделать %)
Похоже эту проблему вообще реально поймать только если у вас лоадер/урллоадер, причем один на все запросы. Ну или криво обрабатывается приём запроса, без учёта лоадера, его отославшего. Зачем там пинг только не оч. понятно при этом. Ну сделайте каждому запросу по лоадеру/урллоадеру, смотрите какой лоаер что отослал и всё пройдёт, это вот рекомендую. Если жлобиться (не понятно зачем, если они у вас много памяти жрут, то что-то не то наверное), то сделать пул лоадеров и выдавать первый свободный из пула. Но тут, как и при одном лоадере надо учесть возможность того, что свободных лоадеров может не остаться и сделать очередь запросов, которые будут автоматом слаться как только какой-нить лоадер из пула освободиться..
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Регистрация: Mar 2010
Сообщений: 100
|
Ну да, это так. Вот я ищу это место.
я умудряюсь. Я меня в голове появилась небольшая ясность,но все же. Напишу как я делаю. Использую я соответственно Делаю запрос. Если я буду выполнять два запроса подряд, то я смогу отреагировать только на последний запрос. Первый пропадает. (я думаю, сервер отвечает на два запроса, но обработчик ответа (Event.COMPLETE ) реагирует только на последний, может из-зи скорости прихода ответа (слишком быстро один ответ сменяет другой ) ) Поэтому, видимо надо для каждого запроса иметь свои пары URLLoader, URLRequest, URLVariables - что не гуд. Либо делать какую-нибудь переменную отвечающую за загрузку. Т.е. сделал URLLoader.load(URLRequest); флаг поднял (переменная), пришло событие Event.COMPLETE - флаг опустил. И соответственно только при опущеном флаге делать следующий запрос. Или я что то напутал ? У меня постоянно запросы друг на друга накладываются. Судя по приведенному коду тоже могут запросы накладываться друг на друга. Хотя не буду утверждать |
|
|||||
А может всё-таки кусок кода в студию?
Не могут они накладываться, если всё правильно сделано. Там где-то одна и та же переменная затирается. Я привел пример с кодом - как можно обойтись одной парой. Вернее одним лоадером и масивом реквестов. Но что-то из этого полюбому надо будет в масив заганять. Та и мне кажется что в разы валиднее будет запросы по видам поделить и для каждого вида сделать свою пару и свою очередь. Пусть себе стоит очередь пингов Потом отдельно очередь отправленных сообщений и изменений чата к примеру... И в таком духе. Уж совсем одной лишь парой обойтись не получится. Та и незачем. Добавлено через 3 минуты Цитата:
примерно следующее происходит: 0. лоадер подписан на листенер комплит 1. сформировали реквест 2. послали по нему лоадер 3. не дожидаясь комплита снова сформировали реквест и отправили по нему лоадер. Очевидно же, что лоадер еще не закончил свою деятельность а вы ему уже новую задачу поставили. Не плодить кучи лоадеров можно, и даже нужно. Но только делать это грамотно надо. |
|
|||||
а нельзя свести все к двум фунКциям?
одна отправляет, другая получает? та что отправляет генерирует масив(ну например) реквестов, обрабатывает таймауты и тд та что получает - пытается выяснить что ей прислали и генерирует события. Добавлено через 2 минуты да и переход в таком варианте от URLLoadera к Сокету(при необходимости) - практически безболезненный Последний раз редактировалось drnet_ua; 08.12.2010 в 14:34. |
|
|||||
Цитата:
Чтоб легче распознавать было делаю так: Я GC доверяю Правда и сильно сложных задач еще решать не приходилось в этом направлении. Мож и не прокатит при больших нагрузках. |
|
|||||
Регистрация: Mar 2010
Сообщений: 100
|
Цитата:
Попробую по другому. Если что напишу свой код, а то так сразу и не выдернешь из программы. Спасибо, очень помогли. Добавлено через 13 минут Да, и еще, что то возник вопрос, можно же запросы к серверу выполнять и через (может и еще чем-то) В чем отличие от Что лучше, или без разницы ? |
Часовой пояс GMT +4, время: 08:46. |
|
« Предыдущая тема | Следующая тема » |
|
|