![]() |
Вопрос к профи: как лучше организовать многократный опрос сервера?
Друзья, прошу помощи по следующей проблеме - нужно организовать взаимодействие с сервером (отправку/прием данных в xml). По запросу юзера(нажатию кнопочки) Flash-клиент вызывает сценарий PHP, который в ответ отдает ему XML. Запросы пользователи могут делать довольно часто (нажимать кнопочку раз в 0,5-1 сек.), а сервер возвращает довольно большой пакет данных.
Вопрос, собственно, в том, каким образом сбрасывать соединение, если пользователь вызывает новый запрос из флэшки. Т.е. предположим юзер нажал кнопку обновления -> пошел запрос к скрипту script.php -> скрипт отдает данные XML, пакет по медленному (скажем модемному) соединению идет к флэшке... и вдруг пользователь не дождавшись поступления старых данных требует обновления и вновь посылает запрос. Что произойдет с этим недокачанным пакетом? Нужно как-то его сбросить... На флэше сделано так: создается LoadVars, определяется обработчик onLoad к нему, вызывается load(script.php). Если пользователь делает новый вызов скрипта LoadVars, то убивается (delete LoadVars_obj) и тут же снова создается, опять определяется обработчик onLoad к нему и вызывается load(script.php). Вопрос в том что при многократном быстром нажатии кнопки "обновить" возникают какие-то задержки (тест на модеме) в получении данных. Сдается мне, что как-то оно глючит... Не может ли быть случайно так, что объект принимает сразу несколько переданных сервером пакетов (т.е. часть старых, вызов которых был инициирован уже удаленной копией объекта)? |
Если ты думаешь обмениваться XML-данными, то LoadVars тут явно не подходит. Для этих целей нужно использовать классы XML или XMLSocket. Второй класс более предпочтителен, так как умеет "держать" соединение, а не инициировать его каждый раз, когда возникает необходимость обмена данными с сервером.
|
Ой, ой ой... XML конечно, а не LoadVars :) Опечатка! Туплю... Сокет не подходит, к сожалению.
|
Для отбрасывания "устаревших" данных можно попробовать отсылать серверу какой-либо идентификатор (например, номер) соединения, чтобы сервер, увидев что запрашиваются новые данные, когда старые еще не отправлены, заканчивал передачу "старых" данных и начинал передавать новые.
|
А не проще ли заблокировать кнопку обновления до тех пор, пока не получим результат :)
А вообще неплохо использовать Flash Remoting + php, это продуктивнее, потому из флэша напрямую будешь вызывать php функции и получать результирующий объект, который не надо парсить, как XML. Соответственно будет работать быстрее чем связка Flash<->XML<->php, где мы используем XML как промежуточное звено. |
Madasan, а где можно про Flash Remoting информацию достать?
|
Данные для всех этих запросов получаются одинаковыми, никаких обновления на сервере за короткий промежуток не происходит. Вопрос в том что
delete XMLObj; XMLObj = new XML(); XMLObj.load("script.php"); однозначно убивает старый объект XML? невостребованная партия данных не может попасть во вновь созданный XML? (который уже успел отправить новый запрос load) |
кнопка сейчас и блокируется на несколько секунд, но хочется теорию этого вопросы понять... вдруг данные от предыдущего вызова "задержаться" и придут уже во вновь созданный объект? или такого быть не может?
|
>'Madasan, а где можно про Flash Remoting информацию достать?'
Да вот на русском не густо http://novemberain.com/tools/index.php/Flash_Remoting А на английском найти не сложно. http://www.adobe.com/devnet/flash/articles/amfphp.html |
Спасибо
|
Цитата:
|
Цитата:
|
по теме больше мыслей нет? :)
|
Цитата:
|
Сделай метод-оболочку для метода send или sendAndLoad, в котором проверяй переменную, показывающую статус объекта XML (загружаю или свободен) и если экземпляр XML в настоящее время загружает, прерывай работу метода:
Код:
myLoader:XML = new XML(); |
Блин, вопрос-то изменился. Если убивается объект XML, то соединение закрывается. По крайней мене здравый смысл подсказывает, что должно работать именно так. По идее, оператор delete, примененный к объекту XML должен вызывать что-то типа внутреннего метода die(), который обязан закрыть коннект и прервать получение данных.
|
Цитата:
|
это-то все понятно... а если в процессе передачи произошла ошибка и onLoad не выполнилось? нет, мне так просто не покатит :) щас буду пробовать...
|
хм, а проблема похоже в том, что обработчик onLoad delete'ом не убивается!!! После завершения загрузки одной из порций данных он вызывается несмотря ни на что! Что-то не понятное....
http://www.flasher.ru/forum/showthread.php?t=79881 |
Цитата:
Загружаем несуществующий документ в данный -- и все. Со звуком такая штука отрабатывает. MovieClipLoader останавливается удалением контейнера... |
Цитата:
Код:
testXML.onLoad = null;Код:
testXML = new XML();Как остановить загрузку первого файла? |
Офигенная эта штука flash remoting!
только яндекс выдет почему то предложения на неё от 65 до 5000 баксов. В чем разница? кто нить работал? |
| Часовой пояс GMT +4, время: 10:29. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.