Спецификация AMF и AMF3

В настоящее время я работаю над небольшим адаптером AMF3 и поэтому пытаюсь реализовать протокол AMF3. К сожалению, имеющиеся спецификации сильно отличаются от реальности (Captre из AMF связывается с BlazeDS и изучает исходный код BlazeDS).

Спецификация AMF0: http://opensource.adobe.com/wiki/download/attachments/1114283/amf0_spec_121207.pdf Спецификация AMF3: http://opensource.adobe.com/wiki/download/attachments/1114283/amf3_spec_05_05_08.pdf

К сожалению, оба не указывают фактический формат сообщения (заголовок, тело,...). Поэтому я поискал еще немного и нашел статью в Википедии: http://en.wikipedia.org/wiki/Action_Message_Format

Эта статья, особенно части примеров, похоже, описывают совершенно другой формат.

При просмотре сообщения и выполнении кода BlazeDS я вижу, что сообщение претендует на звание AMF3, но использует коды типов, определенные в AMF0 (0x0a — это строгий массив, а не объект, как определено в AMF3).

Может ли кто-нибудь объяснить мне этот беспорядок? В настоящее время я, вероятно, просто собираюсь использовать wireshark и код BlazeDS, чтобы каким-то образом перепроектировать описание протокола для меня, но я не знаю, почему нет ни одной действительной спецификации.


person Christofer Dutz    schedule 05.12.2011    source источник
comment
Могу я спросить, почему вы пишете свой собственный адаптер? Вы используете какой-то экзотический язык?   -  person Cornel Creanga    schedule 13.12.2011
comment
Я пытаюсь создать адаптер, работающий на J2ME... не смог найти здесь никакого работающего решения. Я мог бы начать миграцию несовместимых частей существующего стека, но мне нужна лишь небольшая часть полноценного стека, и я хотел, чтобы реализация была как можно более простой и малой (размер байт-кода).   -  person Christofer Dutz    schedule 14.12.2011


Ответы (2)


AMF по своей сути является просто форматом сериализации объектов ActionScript.

API Flash NetConnection расширяет этот формат, добавляя базовые функции RPC через простую структуру запроса/ответа заголовка/тела сообщения, которая описана в разделе 4 спецификации AMF 0. Я думаю, что это добавление RPC может сбить вас с толку, поскольку именно инфраструктура определяет, как отдельные полезные нагрузки данных AMF отправляются и принимаются с сервера. Эта оболочка не используется, например, для базовой сериализации объектов ActionScript через ByteArray.writeObject. Это дополнительная логика для связи на основе NetConnection с сервером.

См.: http://download.macromedia.com/pub/labs/amf/amf0_spec_121207.pdf

Данные ActionScript, фактически отправляемые для значений заголовков или значений тела сообщения, закодированы в AMF. Все значения данных начинаются с AMF 0 для совместимости. Это может быть еще одним моментом, который сначала сбивает людей с толку, когда они смотрят на базовую сериализацию AMF по сравнению с связью на основе NetConnection. Благодаря специальному расширению, добавленному к AMF 0, был введен новый маркер режима 0x11 «AMF 3», который переключает режим сериализации на AMF 3. Устаревшие клиенты, не поддерживающие AMF 3, не будут понимать этот новый маркер и перестанут обрабатывать данные. . Это упоминается в разделе 3 спецификации AMF 0.

Спецификация AMF 3 находится здесь: http://download.macromedia.com/pub/labs/amf/amf3_spec_121207.pdf

person Pete    schedule 06.09.2012
comment
Спасибо за это объяснение. Как я уже писал некоторое время назад, я, наконец, понял формат и даже смог создать парсер для десериализации в системе J2ME (Просто простой POC). Но вы были правы... вещи NetConnection меня смущали ;-) - person Christofer Dutz; 06.09.2012

Существует два основных типа обмена сообщениями AMF: RPC-вызовы в стиле AMF0 и RTMP. Вызовы RPC AMF0 состоят из версии, списка заголовков и списка сообщений, которые примерно соответствуют вызываемым методам. Это задокументировано в конце спецификации AMF0 и может использоваться для совершения удаленных вызовов AMF0 или AMF3. Если вы используете Flex RemoteObject, есть несколько дополнительных объектов-оболочек, которые Flex использует при обмене сообщениями. Второй тип, на который вы нашли ссылку в статье Википедии, — это формат сообщения, который использует RTMP, который представляет собой комбинацию AMF и его собственного пользовательского формата. Насколько я знаю, спецификаций для этого формата нет.

Как человек, который создал библиотеку, которая может анализировать AMF и выполнять вызовы RPC (RocketAMF), я бы посоветовал вы используете одну из существующих библиотек, а не пишете свою собственную, если вам просто нужна удаленная поддержка. Ниже приведен список некоторых библиотек для синтаксического анализа AMF по языкам, многие из которых можно найти простым поиском. Вы также можете проверить Charles, который способен десериализовать запросы AMF, проксируемые через него, делая обратные инженерия немного проще.

person warhammerkid    schedule 06.12.2011
comment
В последнее время я не работал с PHP в AMF, но в последний раз слышал, что разработчик AMFPHP работал с Zend над Zend::AMF. Итак... AMFPHP мертв, но он должен жить как Zend::AMF. - person warhammerkid; 06.12.2011
comment
Я заметил здесь на StackOverflow, что AMPHP работает в 5 раз быстрее. Звучит невероятно. - person AsTheWormTurns; 06.12.2011
comment
Ну, с одной стороны, я просто хотел понять протокол. С другой стороны, я сыт по горло всеми этими полномасштабными решениями, которые делают намного больше, чем мне нужно, и имеют множество причуд, отлаживать которые — кошмар. Меня особенно интересуют потоковые соединения, и я хотел бы иметь немного более оптимизированную десериализацию на стороне Java (например, Blazeds десериализует байты как байты. К счастью, мне удалось выяснить, как работает протокол. Я даже начал документировать его в своей вики. Надеюсь, это документ даст другим жизненно важные части информации- - person Christofer Dutz; 08.12.2011