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

Вернуться   Форум Flasher.ru > Блоги > Lecosson

Оценить эту запись

Рецепт серверного Flash

Запись от Lecosson размещена 29.05.2012 в 05:30

Да-да, я помню. Сейчас все любят оптимизацию серверов, стартапы, Ruby, HTML5, юникс, Crome и считают Flash умирающей платформой. А я пользователь Windows, люблю Firefox, обожаю ActionScript и пользуюсь им всего - генерации сложных SQL-запросов, обработки текстов и создания плагинов к Фотошопу. Если бы на нем можно было писать серверную часть сайтов – я бы это делал, в моем Eclipse разве что такого плагина не хватает.
Впрочем - почему нет?
Немного погуглив, я нашел на гитхабе проект mod_actionscript – модуль для Apache. Вероятно, это было как раз то, что надо, но сборки имелись только под *nix. Дальнейший поиск привел к родственному проекту Redtamarin. Это фактически тот самый флеш, только консольный. Подходит.
Для начала скачиваем и собираем пакет инструментов «redtamarin tools». После сборки получаем утилитку «EclipseExternalTools.exe», переносим ее в workspace Эклипса и запускаем, в результате получаем настроенный набор external tools для компиляции, отладки и запуска консольных ActionScript3 приложений.
Теперь создаем новый проект ActionScript. Не мудрствуя лукаво, я назвал его «redtamrin». Отрезаем Flex Framework – не нужен он на сервере. Из проекта «redtamarin tools» забираем несколько *.swc и подключаем их к проекту, чтобы получить автокомплит для классов, обеспечивающих работу с API операционной системы – чтение/запись файлов, сеть и т.п.
Поскольку я хочу не создавать десктопные приложения, а запустить AS3 на сервере, мне понадобится всего лишь правильный текст на выходе. Например, вот таким образом:
Код AS3:
package
{
	public class redtamarin
	{
		public function redtamarin ()
		{
			var output:XML=<html/>;
			output.appendChild(<head/>);
			output.appendChild(<body/>);
			output.body[0].appendChild(<h1>test title</h1>);
			output.body[0].appendChild(<p>test paragraph</p>);
			trace(output.toXMLString());
		}
	}
}
var html:*=new redtamarin();
После компиляции получится крохотный бинарный файл «redtamarin.abc», который я перенес в корневую папку локального сайта. Расширение означает «ActionscriptByteCode». Если запустить его в консоли с помощью собранного ранее интерпретатора из «redtamarin-tools», мы получим текст созданной нашей программой web-странички.
Итак, серверный скрипт на нужном языке у нас есть. Теперь надо научить Apache распознавать его и отдавать браузеру.
Среди богатого набора модулей самого известного web-сервера есть «filter_module». Открываем конфиг «httpd.conf» нашего Денвера-Wamp-другой сборки и раскомментируем строку:
Код:
LoadModule ext_filter_module modules/mod_ext_filter.so
Это позволит нам пользоваться возможностями модуля фильтрации, который поможет нам обрабатывать наши нестандартные скрипты. Там же, в «httpd.conf», прописывам действия,которые должен выполнить сервер при обращении к скрипту *.abc. К сожалению, интерпретатор redshell.exe любит, когда ему скармливают файлы, а Апач любит отдавать поток в stdin. Поэтому пришлось пропустить исполнение через небольшую прослойку. Самым быстрым вариантом оказалось написать стандартный BAT-файл. Значит, добавляем в конфигурацию сервера строки:
Код:
ExtFilterDefine abc-to-html mode=output intype=text/abc outtype=text/html cmd="… путь к директории на сервере … bin/processabc.bat"
SetOutputFilter abc-to-html
AddType text/abc .abc
Эти инструкции в конфигурации сервера указывают подключенному модулю фильтрации, что при обращении к скрипту надо его перед выдачей пропустить через некий исполняемый файл, в данном случае BAT-сценарий. Но вот беда, батники тоже плохо ладят с входным потоком. Зато в них доступны переменные окружения, в которых сервер щедро разложил много нужных данных. Вот что выдаст команда SET в этом сценарии:
Код:
GATEWAY_INTERFACE=CGI/1.1
PROMPT=$P$G
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
… тут еще много всего интересного …
SERVER_ADMIN=…моя почта…@mail.ru
SCRIPT_FILENAME=… путь на сервере …/www/redtamarin.abc
REMOTE_PORT=47938
DOCUMENT_URI=/redtamarin.abc
DOCUMENT_PATH_INFO=
Аллилуйя. Теперь мы можем отдать интерпретатору файл (и аргументы, если понадобится).
Пишем в нашем «processabc.bat» следующее:
Код:
@echo off
… путь на сервере … bin/redshell.exe %SCRIPT_FILENAME%
Первой строкой отключаем лишний вывод, второй – отправляем на исполнение скомпилированный ранее файл скрипта, адрес которого в файловой системе мы получили из переменных окружения. Спонсор переменных окружения - Apache/2.2.21 (Win32). Поток, отправленный в stdin, не пригодился, какая жалость.
Открываем в браузере адрес http://… наш_сервер …/redtamarin.abc и видим простейшую HTML-страницу, которую мы запрограммировали на ActionScript. Нажатие Ctrl-U показывает следующее:
PHP код:
<html>
  <
head/>
  <
body>
    <
h1>test title</h1>
    <
p>test paragraph</p>
  </
body>
</
html
Как у программистов принято говорить в конце? Profit?
Всего комментариев 12

Комментарии

Старый 29.05.2012 10:31 alexcon314 вне форума
alexcon314
Действительно, аллилуйя. Что там с GET и POST запросами?
Обновил(-а) alexcon314 29.05.2012 в 10:43
Старый 29.05.2012 10:49 Astraport вне форума
Astraport
 
Аватар для Astraport
Теперь осталось узнать - зачем?
Старый 29.05.2012 11:20 Tails вне форума
Tails
 
Аватар для Tails
Прикольно
Ещёб JS с синтаксисов AS3, вообщеб здорово было
Обновил(-а) Tails 29.05.2012 в 11:29
Старый 29.05.2012 12:02 Lecosson вне форума
Lecosson
Astraport, just for fun.
Старый 29.05.2012 12:05 Lecosson вне форума
Lecosson
Alexcon413, все можно прирутить, просто не хотелось возиться. Интересно было именно реализовать. Помните про переменные окружения? Get сейчас можно передать в аргументах командной строки, POST - включив вместо bat-файла прослойку, которая должным образом передаст параметры интерпретатору.
Старый 29.05.2012 12:07 Lecosson вне форума
Lecosson
Talis, вообще-то это он и есть. ActionScript - это следующий Javascript, как он был задуман, плюс набор флешовых классов. Тамаринчик же
Старый 29.05.2012 12:35 alatar вне форума
alatar
 
Аватар для alatar
У вас получился php-style (точнее script-style): получили запрос, запустили программу, убили программу после завершения. Что влечет дополнительные расходы на запуск/остановку программы. В Redtamarin есть полноценный сокет, можно написать полноценный веб-сервер и избавиться от Apache. Или собрать вашу программу в исполняемый файл и подключать к Apache ее (соответственно, можно будет обрабатывать stdin).
Старый 29.05.2012 14:15 Aquahawk вне форума
Aquahawk
 
Аватар для Aquahawk
alatar Это было бы круто. Ещё можно было бы вебсервер оставить вебсервером пусть nginx соблюдает все формальности http, а приложение получает уже от него переработанные запросы и отвечает на них.
Обновил(-а) Aquahawk 29.05.2012 в 14:18
Старый 29.05.2012 17:52 Lecosson вне форума
Lecosson
Alatar, все верно. Просто стало интересно - попробовать саму возможность. А готовых решений для домашнего компа под Win не нашлось.
Старый 30.05.2012 12:29 wvxvw вне форума
wvxvw
 
Аватар для wvxvw
Если уж писать свой сервер, то, скорее, как модуль к тому же Апачу. Писать совсем с нуля - бесперспективно: не сделать на Флеше сервер лучше чем на сях, тем более, что люди, которые Апач делают все-таки опыт имеют.
Старый 01.06.2012 14:06 incvizitor вне форума
incvizitor
 
Аватар для incvizitor
Ну если делать гаму с синхронизацией, то было бы не плохо, что бы код отвечающий за логику был не просто анологичным на клиенте и на сервере, а тем же самым.
Старый 01.06.2012 18:12 Lecosson вне форума
Lecosson
Инквизитор, согласен. Особенно приятно то, что код был бы общим для серверной и клиентской части - вынести модели и контроллеры в отдельную swc и подключать к обеим частям проекта.
 
Последние записи от Lecosson

 


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


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