![]() |
Flash & Comet не получается состыковать
Вопрос назрел внезапно и его не получается разрешить уже несколько дней ... пока только лишь локализовать проблему.
Сразу скажу, что на локальном сервере при разработке и тесте все работает замечательно (не из-под среды флеша, а как локальный веб-проект). Сервер на Java, поэтому для теста на удаленном сервере в качестве веб-сервера поставил Apache Tomcat (6.0.20), у которого в качествен входных портов заменил его 8080 на обычный 80 - чтобы избежать вопросов и проблем с настройкой Apache Web Server или IIS. Коннектор на HTTP1.1 поставил с неблокирующим IO - Http11NioProtocol - для работы с Comet. Сокет создаю вполне стандартный: Код AS3:
Соединение и отправка осуществляется по сценарию: получаем политику (все пучком - на сервере демон на 843 порту и на запрос клиента возвращает '<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>'), затем коннектимся к серверу и отправляем запрос с Transfer-Encoding: chunked, куда также добавлен ID сессии для получения доступа к атрибутам сессии. Запрос благополучно уходит, CometServlet также благополучно его обрабатывает, подхватывает сессию, извлекает данные гостя (клиента) и помещает в коллекцию гостей со всеми параметрами, в частности, с респонсом для дальнейшего общения с клиентом. После установления соединения клиент отправляет первый пакет (в коде это sendPacket({пользов.объект с ID команды для запуска});), в ответ на который сервер производит манипуляции и отправляет флеш-клиенту ответ. Все перечисленные действия подтверждены логами Томкета (я уже расставил где только можно). Для просмотра движений по сети поставил сниффер (Wireshark), вот его логи сразу после ответа серверного 843-го моему: от меня серверу: GET /comet HTTP/1.1 Host: mysite.com:80 Transfer-Encoding: chunked Cookie: JSESSIONID=6306F2AB5A17DF1BA25F54238560313B сервер тут же ответил: HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Transfer-Encoding: chunked Date: Sat, 16 Jan 2010 17:51:00 GMT и пакет: 4d {"action":{"action_id":101,"action_type":1,"sender":2,"message":"Guesttttt"}} То есть все как и должно быть. Их там еще пару штук пришло (видно из логов). Однако флешка не среагировала никак! Что бы я ни делал, как бы не менял - событие ProgressEvent.SOCKET_DATA не срабатывает! Хотя при локальном соединении при ВСЕХ идентичных параметрах (только mysite.com заменен на 127.0.0.1:8080) все отрабатывает отлично. Вначале я грешил на Томкет сервера, что он неправильно ставит заголовки (типа появляется Content-Length: 0), но после установки сниффера все встало на места - на мою сетевую карту сервер возвращает абсолютно валидный ответ, сервер работает точно в соответствии со сценарием и т.д. Что копать, где копать - не знаю, потому прошу помощи. Также если есть люди, занимающиеся подобной тематикой (в частности, онлайн-играми), вполне ли удачный протокол, транспорт и способ я выбрал? - Вроде по скорострельности весьма (судя до временным логам сниффера), также радует возможность CometServlet чутко реагировать не только на соединение и получение данных, но также определять разрыв и его причину (таймаут, обложка клиента, сервера и т.д.). Томкет в качестве сервера явление временное - сначала поставил IIS (сервер на винде 2003) - но после 2 дней мытарств оказалось, что IIS 6.0 не хочет нормально работать с chunked. Поэтому пока нормальная эволюция - Apache Web Server (возможно, RedHat). |
Апач вам выйдет ооочень дорого. Посудите сами, 100 открытых страниц*— это почти гигабайт занятой оперативной памяти, потому как один инстанс апача, висящий в ожидании кометового ответа порядка 8-10 МБ.
А почему вы не хотите воспользоваться XML Sockets? Ведь это гораздо удобнее с флешем. |
Насчет апача ты очень погорячился ... в том-то и дело, что инстанс почти ничего не весит. Апач легко (!!!) держит до 20 тысяч активных подключений - проверено. Кроме этого, планируется кроме Томкета еще и Вебсервер, что разгрузит сам Томкет статическими реквестами. В любом случае - это один из самых выгодных вариантов (IIS намного "тяжелее").
Да и проблемы у меня нет с серваком - 8 свежих ядер ксеона, райд 3+1, 4Гб памяти, коллокейшн на 20Мбит и все это под один мой проект :) ... По теме: а не могут какие-то политики (секъюрити) блокировать на клиенте входящие по сокету сообщения? Или раз клиент послал запрос на сервер, то сокет подключился и блокировать уже ничто ничего не может? Добавлено через 27 часов 0 минут Изменил комет-сервлет так, чтобы при подключении или запросе он отдавал строку, аналогичную рабочей, и запустил флешку из-под среды Флеша ... нормально получил. Я так понимаю, что это значит, что проблема не в сетевых настройках или настройках сервера, а касается исключительно безопасности самой флешки, так как с сайта флешка так ничего и не получила? Чем таким "глобальным" может отличаться запуск флешки из-под среды с доступом к удаленному серверу и флешка с домена, к которому потом подключается? Тем более, что сам сервер реагирует одинаково в обоих случаях? Я уже так основательно запутался, столько прочитал и столько наизменял, что ситуация выглядит очень тупиковой ... :( Очень прошу помощи знающих людей ... если нужны наводящие ответы, с радостью отвечу на все вопросы ... |
Уж извините, что немного не по теме, но я не понимаю, как у вас апач мог держать 20 тыс одновременных соединений. Даже в тредном режиме, он будет отводить по 2 МБ на нитку, а это означает 4 ГБ ОЗУ, выброшеных в помойку. Если у вас были другие цифры, то вам стоило бы написать об этом грандиозную статью, потому что вы какое-то чудо совершили.
Что вам отдает crossdomain.xml на 80-м порту? Может это критично для флеша? |
Цитата:
Код AS3:
Проблему вчера поздно ночью решил (аж не верится). Были подозрения, что дело может быть в сокете, открываемом на стандартный 80-ый порт (и где раньше мозги были?). Пустил основной веб-сервер с коннектором на Томкет, а сокет открываю на порт 1999, который на сервере перенаправляю минуя веб-сервер сразу на порт 8080 Томкета. И заработало! |
| Часовой пояс GMT +4, время: 08:52. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.