2016-05-24 6 views
0

Я учусь о Flash (AMF) и Java (BlazeDS) с помощью проекта я нашел в Интернете, но я заметил, что сервер получает через гнездо данные ниже:неизвестные пакеты, отправленные Flash,

enter image description here Когда я попытался использовать Amf0Input/Amf3Input me для возврата объекта, я получаю сообщение об ошибке, которое не распознает этот тип пакета. Кто-нибудь знает, какую библиотеку я должен использовать для декодирования этого сообщения?

ответ

3

Пакет, который вы получили, представляет собой префикс AMF3 AmfObject.

В общем, всякий раз, когда вы видите строку, которая следует за обычное именование полных имен классов (т.е. как обратные домены), скорее всего, вы имеете дело с object например .

Рассматривая первые несколько байтов, вы видите 0x00 три раза. Если мы предположим, что AMF3, это будет 3 undefined s, за которым следует объект с маркером типа 0x3e - которого не существует. Если мы предположим, что AMF0, у нас сначала будет число (0x00 маркер типа, за которым следует 8 байтов данных), за которым следует объект с маркером типа 0x6d - который снова не существует.

Таким образом, данные, которые вы получили, не могут быть полезны только для AMF. Однако, если мы интерпретируем первые 4 байта как порядковый номер сети (т. Е. Большой конец), получим 0x3E = 62 - это точно длина оставшихся данных.

Предполагая, что первые 4 байта являются префикс длины, следующий байт должен быть маркером типа. В AMF3 0x0a указывает экземпляр object. Поэтому давайте просто попробуем декодировать оставшиеся данные (раздел 3.12 из AMF3 spec, если вы хотите следовать вдоль): следующий байт должен указывать признаки объекта. 0x23 означает, что мы имеем прямое кодирование признаков этого байта - в отличие от ссылки на ранее представленные объекты.

Поскольку четвертый бит (считающийся с наименьшим значащим первым) равен 0, объект не является динамическим - как в примере экземпляра некоторого класса, а не просто экземпляром простого объекта. Остальные биты, сдвинутые вправо на 4, указывают количество запечатанных свойств этого экземпляра, которое равно 2.

Далее мы ожидаем имя класса, закодированное как UTF-8-vr - т.е. длина префикса (при сдвиге справа на 1) , Кодированная строка UTF-8. Следующий байт равен 0x1d, что означает, что длина равна 0x1d >> 1 = 14. Следующие 14 байтов кодируют common.net.APC, так что это имя класса экземпляра.

Впоследствии у нас есть два запечатанных названия свойств, также закодированные как UTF-8-vr. Первый имеет префикс 0x15, поэтому длина 10 - дает нам parameters, а затем префикс 0x19 (длина 12) и полезную нагрузку functionName.

После этого у вас есть значения, соответствующие этим герметичным свойствам, в том же порядке. Первый имеет маркер типа 0x09, который соответствует массиву. Маркер длины - 0x03, что означает, что массив содержит один элемент, а следующий байт - 0x01, что указывает на отсутствие ассоциативных элементов. Единственный элемент имеет маркер типа 0x04, то есть это integer - в этом случае со значением 0.

За этим следует маркер типа 0x06 - строка с длиной 14. Эта строка - вы, наверное, догадались об этом до сих пор - это syncServerTime.

Так, в целом, ваш пакет длина префикса экземпляр common.net.APC, с его parameters атрибут установлен в [0], а атрибут functionName установлен "syncServerTime".


1: Единственные другие альтернативы вектор экземпляров объекта - что потребовало бы типа маркера 0x10 где-то - или пакет AMF0. В случае пакета AMF0 вы также должны иметь путь в стиле URI где-то в пакете, что здесь не так.

2: Обратите внимание, что EBNF приведены в конце раздела не совсем правильно - ни синтаксически, ни семантически ...

+0

Спасибо, решить мою проблему – ExtremsX