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

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

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

Регистрация: Jan 2010
Сообщений: 211
По умолчанию Flash & Comet не получается состыковать

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

Сервер на Java, поэтому для теста на удаленном сервере в качестве веб-сервера поставил Apache Tomcat (6.0.20), у которого в качествен входных портов заменил его 8080 на обычный 80 - чтобы избежать вопросов и проблем с настройкой Apache Web Server или IIS. Коннектор на HTTP1.1 поставил с неблокирующим IO - Http11NioProtocol - для работы с Comet.

Сокет создаю вполне стандартный:
Код AS3:
public class Connection extends Socket {
	public function Connection() {
		super();
		Security.loadPolicyFile("xmlsocket://mysite.com:843");
		addEventListener(Event.CLOSE, closeHandler);
		addEventListener(Event.CONNECT, connectHandler);
		addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
		addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
		addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
		super.connect("mysite.com", 80);
	}
	override public function close():void {...
	private function ioErrorHandler(event:IOErrorEvent):void {...
	private function securityErrorHandler(event:SecurityErrorEvent):void {...
	private function closeHandler(event:Event):void {...
	public function sendPacket(send_packet:ConnectionObject):void {
		var packet:String = '{"action_id":' + send_packet.action_id + ',"action_type":' + send_packet.action_type + ',"message":"' + send_packet.message + '"}';
		try {
			writeUTFBytes('\r\n');
			writeUTFBytes(new Number(packet.length).toString(16) + '\r\n' + packet + '\r\n');
			flush();
		} catch(exception:IOError) {
			trace(exception);
		}
	}
	private function connectHandler(event:Event):void {
		writeUTFBytes("GET /comet HTTP/1.1\r\nHost: mysite.com" + "\r\nTransfer-Encoding: chunked\r\nCookie: JSESSIONID=" + {тут полученный со страницыJSESSIONID} + "\r\n");
		sendPacket({пользов.объект с ID команды для запуска});
	}
	private function socketDataHandler(event:ProgressEvent):void {
		var loaded_str:String = readUTFBytes(event.bytesLoaded);
		var packets:Array = Chunked.decode(loaded_str);
		for (var i:int = 0; i < packets.length; i++) {
			var message:Object = JSON.decode(packets[i]);
			var recieve_object:ConnectionObject = new ConnectionObject(message.action);
			if (recieve_object != null) dispatchEvent(new CustomEvent(CustomEvent.RECIEVE_DATA_EVENT, recieve_object));
		}
	}
}
Начинка socketDataHandler не должна волновать - пока я хочу просто на входе получить строку - ответ сервера.
Соединение и отправка осуществляется по сценарию: получаем политику (все пучком - на сервере демон на 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).

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

Регистрация: Aug 2008
Сообщений: 197
Отправить сообщение для maxlapshin с помощью ICQ
Апач вам выйдет ооочень дорого. Посудите сами, 100 открытых страниц*— это почти гигабайт занятой оперативной памяти, потому как один инстанс апача, висящий в ожидании кометового ответа порядка 8-10 МБ.

А почему вы не хотите воспользоваться XML Sockets? Ведь это гораздо удобнее с флешем.

Старый 17.01.2010, 20:16
Dimitry_II вне форума Посмотреть профиль Отправить личное сообщение для Dimitry_II Найти все сообщения от Dimitry_II
  № 3  
Ответить с цитированием
Dimitry_II

Регистрация: Jan 2010
Сообщений: 211
Насчет апача ты очень погорячился ... в том-то и дело, что инстанс почти ничего не весит. Апач легко (!!!) держит до 20 тысяч активных подключений - проверено. Кроме этого, планируется кроме Томкета еще и Вебсервер, что разгрузит сам Томкет статическими реквестами. В любом случае - это один из самых выгодных вариантов (IIS намного "тяжелее").
Да и проблемы у меня нет с серваком - 8 свежих ядер ксеона, райд 3+1, 4Гб памяти, коллокейшн на 20Мбит и все это под один мой проект ...


По теме: а не могут какие-то политики (секъюрити) блокировать на клиенте входящие по сокету сообщения? Или раз клиент послал запрос на сервер, то сокет подключился и блокировать уже ничто ничего не может?

Добавлено через 27 часов 0 минут
Изменил комет-сервлет так, чтобы при подключении или запросе он отдавал строку, аналогичную рабочей, и запустил флешку из-под среды Флеша ... нормально получил.

Я так понимаю, что это значит, что проблема не в сетевых настройках или настройках сервера, а касается исключительно безопасности самой флешки, так как с сайта флешка так ничего и не получила?

Чем таким "глобальным" может отличаться запуск флешки из-под среды с доступом к удаленному серверу и флешка с домена, к которому потом подключается? Тем более, что сам сервер реагирует одинаково в обоих случаях? Я уже так основательно запутался, столько прочитал и столько наизменял, что ситуация выглядит очень тупиковой ...

Очень прошу помощи знающих людей ... если нужны наводящие ответы, с радостью отвечу на все вопросы ...

Старый 19.01.2010, 10:43
maxlapshin вне форума Посмотреть профиль Отправить личное сообщение для maxlapshin Найти все сообщения от maxlapshin
  № 4  
Ответить с цитированием
maxlapshin
Erlyvideo

Регистрация: Aug 2008
Сообщений: 197
Отправить сообщение для maxlapshin с помощью ICQ
Уж извините, что немного не по теме, но я не понимаю, как у вас апач мог держать 20 тыс одновременных соединений. Даже в тредном режиме, он будет отводить по 2 МБ на нитку, а это означает 4 ГБ ОЗУ, выброшеных в помойку. Если у вас были другие цифры, то вам стоило бы написать об этом грандиозную статью, потому что вы какое-то чудо совершили.


Что вам отдает crossdomain.xml на 80-м порту? Может это критично для флеша?

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

Регистрация: Jan 2010
Сообщений: 211
Цитата:
Сообщение от maxlapshin Посмотреть сообщение
Что вам отдает crossdomain.xml на 80-м порту? Может это критично для флеша?
Кроссдомейн у меня не на 80-ом, а на стандартном 843-ем (это ж видно из кода). Да и файлика самого нет, так как стринговый поток отдает демон. Кстати, от строки
Код AS3:
Security.loadPolicyFile("xmlsocket://mysite.com:843");
совсем избавился, так как флеш по умолчанию сам туда лезет.

Проблему вчера поздно ночью решил (аж не верится).
Были подозрения, что дело может быть в сокете, открываемом на стандартный 80-ый порт (и где раньше мозги были?). Пустил основной веб-сервер с коннектором на Томкет, а сокет открываю на порт 1999, который на сервере перенаправляю минуя веб-сервер сразу на порт 8080 Томкета. И заработало!

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

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

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


 


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


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