Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 08.12.2010, 10:56
Bond007 вне форума Посмотреть профиль Отправить личное сообщение для Bond007 Найти все сообщения от Bond007
  № 1  
Ответить с цитированием
Bond007

Регистрация: Mar 2010
Сообщений: 100
По умолчанию Как правильно делать запросы к серверу.

Вопрос попробую описать с примера.
Допустим есть приложение, которое отправляет запросы на сервер.
Есть некий запрос ПИНГ, который формируется по таймеру, например раз в 5 секунд (не важно).
Но при этом есть запросы, типа, найти пользователя, удалить пользователя, коннект пользователя и т.д. Эти запросы отправляются когда приспичет.
Но может возникнуть ситуация, когда ПИНГ и ,например, НАЙТИ ПОЛЬЗОВАТЕЛЯ, будут отправляться одновременно, в результате один запрос пропадает (один обработчик ответа от сервера на все).

Как правильно выполнять запросы ?
Как Вы решаете такие вещи ?
Как правильно делать запросы к серверу ?

Старый 08.12.2010, 11:43
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 2  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Не совсем понятно как это происходит. Видимо есть провтыки в логике приложения. Но уж нельзя контролировать очередь запросов к серверу, то в крайнем случае внесите переменную типа: "сервер занят". Если занят значит ждем ответа и только потом отправляем.

Или другой вариант, покрасивее:
Делаете стек запросов, а далее пушите их по-очереди. как-то так:
Код AS3:
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 минуты
Можно сделать еще красивее, но кода будет больше. Хотя и универсальнее получится.
Диспатчей накрутить еще парочку, например: "лоадер_освободился" и в таком духе.

Старый 08.12.2010, 12:22
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 3  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Вообще это надо умудриться сделать %)
Похоже эту проблему вообще реально поймать только если у вас лоадер/урллоадер, причем один на все запросы. Ну или криво обрабатывается приём запроса, без учёта лоадера, его отославшего. Зачем там пинг только не оч. понятно при этом.
Ну сделайте каждому запросу по лоадеру/урллоадеру, смотрите какой лоаер что отослал и всё пройдёт, это вот рекомендую.
Если жлобиться (не понятно зачем, если они у вас много памяти жрут, то что-то не то наверное), то сделать пул лоадеров и выдавать первый свободный из пула. Но тут, как и при одном лоадере надо учесть возможность того, что свободных лоадеров может не остаться и сделать очередь запросов, которые будут автоматом слаться как только какой-нить лоадер из пула освободиться..
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 08.12.2010, 12:28
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 4  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
Сообщение от -De-
Вообще это надо умудриться сделать %)
Таки да)))

Старый 08.12.2010, 13:52
Bond007 вне форума Посмотреть профиль Отправить личное сообщение для Bond007 Найти все сообщения от Bond007
  № 5  
Ответить с цитированием
Bond007

Регистрация: Mar 2010
Сообщений: 100
Цитата:
Сообщение от Dukobpa3 Посмотреть сообщение
Видимо есть провтыки в логике приложения
Ну да, это так. Вот я ищу это место.

Цитата:
Сообщение от -De- Посмотреть сообщение
Вообще это надо умудриться сделать %)
я умудряюсь.

Я меня в голове появилась небольшая ясность,но все же. Напишу как я делаю.
Использую я
Код AS3:
URLLoader
URLRequest
URLVariables
соответственно
Код AS3:
URLLoader.load(URLRequest);
Делаю запрос.

Если я буду выполнять два запроса подряд, то я смогу отреагировать только на последний запрос. Первый пропадает. (я думаю, сервер отвечает на два запроса, но обработчик ответа (Event.COMPLETE ) реагирует только на последний, может из-зи скорости прихода ответа (слишком быстро один ответ сменяет другой ) )

Поэтому, видимо надо для каждого запроса иметь свои пары URLLoader, URLRequest, URLVariables - что не гуд.

Либо делать какую-нибудь переменную отвечающую за загрузку. Т.е. сделал URLLoader.load(URLRequest); флаг поднял (переменная), пришло событие Event.COMPLETE - флаг опустил.
И соответственно только при опущеном флаге делать следующий запрос.

Или я что то напутал ?
У меня постоянно запросы друг на друга накладываются.

Судя по приведенному коду тоже могут запросы накладываться друг на друга. Хотя не буду утверждать

Старый 08.12.2010, 14:01
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 6  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
А может всё-таки кусок кода в студию?

Не могут они накладываться, если всё правильно сделано. Там где-то одна и та же переменная затирается.
Я привел пример с кодом - как можно обойтись одной парой. Вернее одним лоадером и масивом реквестов.
Но что-то из этого полюбому надо будет в масив заганять.

Та и мне кажется что в разы валиднее будет запросы по видам поделить и для каждого вида сделать свою пару и свою очередь.
Пусть себе стоит очередь пингов
Потом отдельно очередь отправленных сообщений и изменений чата к примеру...

И в таком духе.
Уж совсем одной лишь парой обойтись не получится. Та и незачем.

Добавлено через 3 минуты
Цитата:
Сообщение от Bond007
(Event.COMPLETE ) реагирует только на последний, может из-зи скорости прихода ответа (слишком быстро один ответ сменяет другой ) )
Я уже понял в чем ошибка.

примерно следующее происходит:
0. лоадер подписан на листенер комплит
1. сформировали реквест
2. послали по нему лоадер
3. не дожидаясь комплита снова сформировали реквест и отправили по нему лоадер.

Очевидно же, что лоадер еще не закончил свою деятельность а вы ему уже новую задачу поставили.
Не плодить кучи лоадеров можно, и даже нужно. Но только делать это грамотно надо.

Старый 08.12.2010, 14:31
drnet_ua вне форума Посмотреть профиль Отправить личное сообщение для drnet_ua Найти все сообщения от drnet_ua
  № 7  
Ответить с цитированием
drnet_ua
 
Аватар для drnet_ua

Регистрация: Jul 2010
Адрес: 50° 27′ 0″ N, 30° 30′ 0″ E
Сообщений: 256
Записей в блоге: 2
а нельзя свести все к двум фунКциям?

одна отправляет, другая получает?

та что отправляет генерирует масив(ну например) реквестов, обрабатывает таймауты и тд

та что получает - пытается выяснить что ей прислали и генерирует события.

Добавлено через 2 минуты
да и переход в таком варианте от URLLoadera к Сокету(при необходимости) - практически безболезненный


Последний раз редактировалось drnet_ua; 08.12.2010 в 14:34.
Старый 08.12.2010, 15:14
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 8  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
Сообщение от drnet_ua
а нельзя свести все к двум фунКциям?
Как по мне то вообще идеальный вариант. У меня к примеру все лоадеры практически без ссылок. Отработал - умер.
Чтоб легче распознавать было делаю так:
Код AS3:
var loader:Loader = new Loader();
loader.name = "<ID>"
Я GC доверяю Правда и сильно сложных задач еще решать не приходилось в этом направлении. Мож и не прокатит при больших нагрузках.

Старый 08.12.2010, 15:45
Bond007 вне форума Посмотреть профиль Отправить личное сообщение для Bond007 Найти все сообщения от Bond007
  № 9  
Ответить с цитированием
Bond007

Регистрация: Mar 2010
Сообщений: 100
Цитата:
Сообщение от Dukobpa3 Посмотреть сообщение
Я уже понял в чем ошибка.

примерно следующее происходит:
0. лоадер подписан на листенер комплит
1. сформировали реквест
2. послали по нему лоадер
3. не дожидаясь комплита снова сформировали реквест и отправили по нему лоадер.

Очевидно же, что лоадер еще не закончил свою деятельность а вы ему уже новую задачу поставили.
Не плодить кучи лоадеров можно, и даже нужно. Но только делать это грамотно надо.
Да, да, прямо в точку. Именно так я и дклаю

Попробую по другому. Если что напишу свой код, а то так сразу и не выдернешь из программы. Спасибо, очень помогли.

Добавлено через 13 минут
Да, и еще, что то возник вопрос, можно же запросы к серверу выполнять и через
Код AS3:
HTTPService
(может и еще чем-то)
В чем отличие от
Код AS3:
URLLoader
Что лучше, или без разницы ?

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 09:01.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.