Как передать двоичные данные из javascript в actionscript (веб-страницу во флэш-память) без кодирования или сохранения данных?

Ситуация: я пытаюсь заменить связь Flash Socket (диапазон байтов) на javascript, чтобы избежать ограничений файла политики безопасности flash socket.

Подробности: у меня есть двоичные данные из javascript, и я могу передать их во флэш-память с помощью кодирования/декодирования base64, но это слишком медленно. Сохранение на диск и передача локального URL-адреса не вариант (и не только из-за скорости, но и клиенты предпочитают все в памяти, а swf-файлу может быть запрещено загружать локальные файлы). Кроме того, отказ от использования base64 не работает, так как ExternalInterface флэш-памяти использует XML (который не предназначен для передачи двоичных данных) для передачи данных в AS3.

Вопрос: Есть ли способ получить бинарные данные из JS в AS3 без записи на диск и без кодирования bae64?

Я знаю о формате сообщений о действиях (AMF), но, похоже, он добавляет путь ко многим внешним зависимостям и может все еще быть медленным?

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

Благодарность!


person ryanb    schedule 12.07.2012    source источник
comment
Вы исключаете base64 из-за производительности? Что такое двоичные данные? Он большой? Невозможно отправить двоичные данные между Flash и Javascript, если вы не упорядочиваете их в текстовом формате. AMF не будет медленнее, но он для связи клиент/сервер, а не JS‹--›AS3.   -  person Sunil D.    schedule 13.07.2012
comment
Я никогда раньше не слышал, чтобы ExternalInterface использовал XML? Вы можете передавать основные типы данных JavaScript через ExternalInterface. Но почему бы просто не исправить проблемы междоменной политики сокетов, которые у вас есть, вместо того, чтобы искать способ их обойти?   -  person The_asMan    schedule 13.07.2012
comment
AMF — это путь, и он не медленный. Фактически, это быстрее, чем использование JavaScript для кодирования/декодирования. ExternalInterface имеет ограничение на данные 4K, поэтому это ненадежный подход.   -  person Tianzhen Lin    schedule 13.07.2012
comment
Сунил Д. - бинарные данные включают png/jpg и могут быть в мегабайтах, а их может быть десятки/сотни.   -  person ryanb    schedule 13.07.2012
comment
The_asMan - кажется, что ExternalInterface всегда маршалирует XML, и формат указан (вам нужно делать это вручную, когда вы используете элемент управления ActiveX). Когда вы передаете двоичный файл, вы получаете ошибку об отсутствующем элементе ‹/string›. Что касается политики сокетов, то здесь нет проблем, это просто дополнительная работа для клиентов (это намного сложнее, чем просто файл crossdomain.xml для флэш-сокетов). , я передал 3-4 МБ за один звонок.   -  person ryanb    schedule 13.07.2012
comment
@СунилД. правильно (не стесняйтесь повторно опубликовать ответ, чтобы я проголосовал). Я попытался передать двоичный файл AMF, который я захватил с amfphp, но он не проходит через ExternalInterface. Либо я получаю ошибку парсинга xml, либо все байты устанавливаются в ноль, с добавлением дополнительных 5 байт, в зависимости от того, был ли отправлен двоичный файл как возвращаемое значение или параметр, соответственно.   -  person ryanb    schedule 03.08.2012


Ответы (1)


Я немного изменил свое мнение об этой проблеме:

Не существует прямого способа отправки двоичных данных между Flash и Javascript без предварительного преобразования их в текстовый формат (т. е. кодирования base64).

Как отмечено в ОП, для облегчения связи между Actionscript и Javascript ExternalInterface класс на самом деле упорядочивает объекты/данные в формате XML. Таким образом, двоичные данные должны пройти через это преобразование в XML.

Новая идея: когда вы используете ExternalInterface, приложение Flash фактически изменяет DOM, добавляя методы, которые сериализуют/десериализуют данные в/из XML (требуется ссылка, я читал об этом, но не могу найти сейчас) . Технически возможно переопределить эти методы в Javascript и исправить ошибки синтаксического анализа XML, которые вы видели при попытке передать двоичные данные. Вы должны были бы определить имена имен этих методов (я помню, что они начинаются с __Flash__ или что-то подобное).

person Sunil D.    schedule 04.08.2012
comment
Спасибо, я понимаю, о чем вы говорите. Я собираюсь подробнее изучить методы ExternalInterface js, а также то, как SWFObject встраивает двоичный файл swf. - person ryanb; 14.08.2012
comment
Я подумал о другом средстве, хотя я еще не реализовал полный тест. SWF-файлы могут обрабатывать двоичные файлы, а с помощью swfobject.js SWF-файлы могут быть внедрены в DOM. Затем на стороне флэш-памяти класс LocalConnection может передавать двоичные файлы между swf. Тем не менее, LocalConnection имеет ограничение в 40 КБ на send(), поэтому потенциально должна быть отправлена ​​​​группа пакетов AMF. Тогда есть все накладные расходы; создание swf-файла в памяти на чистом JS, внедрение в dom, ожидание запуска нового swf во флэш-памяти, а затем отправка 40-килобайтных пакетов amf. В конце концов, это может быть то же самое, что и кодирование/декодирование base64. - person ryanb; 13.09.2012