stringtranslate.com

Формат сообщения о действии

Формат сообщения действия ( AMF ) — это двоичный формат, используемый для сериализации графов объектов, таких как объекты ActionScript и XML, или для отправки сообщений между клиентом Adobe Flash и удаленной службой, обычно Flash Media Server или сторонними альтернативами. Язык Actionscript 3 предоставляет классы для кодирования и декодирования формата AMF.

Этот формат часто используется вместе с RTMP Adobe для установления соединений и команд управления доставкой потокового мультимедиа. В этом случае данные AMF инкапсулируются в фрагмент , который имеет заголовок, который определяет такие вещи, как длина и тип сообщения (будь то «пинг», «команда» или медиаданные).

Анализ формата

AMF был представлен в Flash Player 6, и эта версия называется AMF0. Он не менялся до выпуска Flash Player 9 и ActionScript 3.0, когда новые типы данных и языковые функции вызвали обновление под названием AMF3. [1] В Flash Player 10 добавлены векторные и словарные типы данных, задокументированные в пересмотренной спецификации от января 2013 года.

Adobe Systems опубликовала спецификацию протокола двоичных данных AMF в декабре 2007 года [2] [3] и объявила, что будет поддерживать сообщество разработчиков, чтобы сделать этот протокол доступным для каждой основной серверной платформы.

Автономный пакет AMF

Следующий amf-пакет предназначен для передачи сообщений за пределами определенных контейнеров Adobe/Macromedia или транспортных средств, таких как Flash Video или протокол обмена сообщениями в реальном времени .

Если длина заголовка или длина сообщения неизвестна, им присваивается значение -1 или 0xFFFFFFFF.

uimsbf: целое число без знака, первый старший бит

simsbf: целое число со знаком, сначала старший бит

АМФ0

Формат определяет различные типы данных, которые можно использовать для кодирования данных. Adobe заявляет, что AMF в основном используется для представления графов объектов, которые включают именованные свойства в форме пар ключ-значение, где ключи кодируются как строки, а значения могут иметь любой тип данных, например строки или числа, а также массивы и другие объекты. XML поддерживается как собственный тип. Каждый тип обозначается одним байтом, предшествующим фактическим данным. Значения этого байта приведены ниже (для AMF0):

Объекты AMF начинаются с (0x03), за которым следует набор пар ключ-значение, и заканчиваются значением (0x09) (перед которым стоит 0x00 и 0x00 как пустая запись ключа). Ключи кодируются как строки с подразумеваемым байтом определения типа (0x02) (не включенным в сообщение). Значения могут быть любого типа, включая другие объекты, и таким образом можно сериализовать целые графы объектов. И ключам объекта, и строкам предшествуют два байта, обозначающие их длину в количестве байтов. Это означает, что строкам предшествуют три байта, включая байт типа 0x02. Нулевые типы содержат только определение типа (0x05). Числа кодируются как числа с плавающей запятой двойной точности и состоят из восьми байтов.

Например, при кодировании объекта ниже в коде ActionScript 3.

var person : Object = { имя : «Майк» , возраст : «30» , псевдоним : «Майк» }; поток вар : ByteArray = новый ByteArray (); транслировать . ObjectEncoding = ObjectEncoding . АМФ0 ; // По умолчанию ByteArray использует поток AMF3 . записьОбъект ( человек );            

Данные, хранящиеся в ByteArray:

Примечание: свойства объекта могут быть отсортированы в порядке, отличном от того, в котором они расположены в ActionScript. Информацию о раскраске/разметке см. в легенде ниже.

Приведенный выше код будет работать только для встроенных классов, таких как Object. Чтобы сериализовать и десериализовать пользовательские классы, пользователю необходимо объявить их с помощью команды RegisterClassAlias, иначе игрок выдаст ошибку.

// для гипотетического класса Person RegisterClassAlias ( "personTypeAlias" , Person ); 

Хотя, строго говоря, AMF — это всего лишь формат кодирования данных, обычно он инкапсулирован в сообщение RTMP или вызов Flex RPC. Пример первого можно найти ниже (это сообщение «_result», возвращаемое в ответ на команду «connect», отправленную из флэш-клиента):

легенда: начало/конец объекта, ключи объекта, значения объекта ecma_array

Сообщение AMF начинается с символа 0x03, который обозначает пакет RTMP с типом заголовка 0 , поэтому ожидается, что за ним последуют 12 байтов. Оно имеет тип сообщения 0x14, который обозначает команду в виде строки значения «_result» и двух сериализованных объектов в качестве аргументов. Сообщение можно расшифровать следующим образом:

( команда ) «_result» ( идентификатор транзакции ) 1 ( значение ) [ 1 ] { fmsVer : «FMS/3,5,5,2004» возможности : режим 31.0 : 1.0 }, [ 2 ] { уровень : «статус» , код : «NetConnection.Connect.Success» , описание : «Подключение выполнено успешно». , данные : ( массив ) { версия : "3,5,5,2004" }, clientId : 1584259571.0 , objectEncoding : 3.0 }                             

Здесь можно увидеть массив (бирюзовым цветом) как значение ключа «данные», который имеет один элемент. Мы видим, что значение objectEncoding равно 3. Это означает, что последующие сообщения будут отправляться с типом сообщения 0x11, что подразумевает кодировку AMF3.

АМФ3

Последняя версия протокола содержит существенные изменения, позволяющие использовать более сжатый формат. Маркеры данных следующие:

За первыми четырьмя типами не следуют никакие данные (в AMF3 есть два типа логических значений).

Дополнительные маркеры, используемые Flash Player 10 (формат по-прежнему называется AMF3), следующие:

AMF3 стремится к большему сжатию, и один из способов достижения этой цели — избежать дублирования строк, сохраняя их в массив, по которому проверяются все новые строки. Байт, следующий за маркером строки, больше не обозначает чистую длину, а представляет собой комплексный байт, в котором младший значащий бит указывает, является ли строка «встроенной» (1), т. е. не находится ли она в массиве или «ссылочной» (0), и в этом случае индекс массива сохраняется. Таблица включает в себя как ключи, так и значения.

В более старых версиях Flash Player существовал один тип чисел, называемый «Число», который представлял собой 64-битную кодировку двойной точности. В последних выпусках есть int и uint, которые включены в AMF3 как отдельные типы. Типы чисел идентичны кодировке AMF0, а целые числа имеют переменную длину от 1 до 4 байтов, где старший бит байтов 1–3 указывает, что за ними следует другой байт.

Поддержка АМФ

Различные протоколы AMF поддерживаются многими серверными языками и технологиями в виде библиотек и служб, которые должен установить и интегрировать разработчик приложения.

Платформы:

Рамки:

Смотрите также

Рекомендации

  1. ^ «Формат сообщения о действии — AMF 3» (PDF) . Январь 2013 . Проверено 1 мая 2021 г.
  2. ^ «Формат сообщения о действии — AMF 0» (PDF) . 2007 . Проверено 1 мая 2021 г.
  3. ^ «Adobe открывает AMF, освобождает исходный код для платформы удаленного взаимодействия, используемой в многофункциональных веб-приложениях» . Арс Техника . Проверено 31 декабря 2017 г.
  4. ^ Особенности | Adobe ColdFusion 9 стандарт