Я использую инструмент Flash для передачи данных на Java. У меня проблемы с отправкой нескольких объектов одновременно. Отправляемые объекты являются просто общими объектными объектами, поэтому нет необходимости регистрировать псевдоним класса или что-либо еще.
Отправка одного объекта работает нормально. Как только я начинаю посылать несколько объектов (помещая одни и те же объекты в массив и отправляя их), это начинает становиться странным. Кажется, что до трех объектов в массиве работают нормально. Более того, я получаю различные ошибки в функции readObject()
, например:
- Неизвестный тип AMF '47'
- Неизвестный тип AMF '40'
- Неизвестный тип AMF '20'
- Индекс исключений OutOfBoundsException 23, размер 0
- NullPointerException
- и т.д.
Отправка 3 объектов будет работать, отправка 4 выдаст мне ошибку. Если я удалю один из предыдущих 3, который работал (сохраняя четвертый, который был добавлен), он будет работать снова. Кто-нибудь знает, что происходит?
Дополнительная информация:
- Связь происходит через класс Socket на стороне Flash. Это чистый AS3, не гибкий.
- Сообщения сжимаются перед отправкой и распаковываются на сервере, поэтому я почти уверен, что это не проблема размера буфера (если я что-то упустил)
- BlazeDS версия, кажется, 4.0.0.14931 на банке
- Flash версия 10.1 (это приложение AIR)
Обновление с приблизительным кодом
Примеры отправляемых объектов:
var o:Object = { };
o._key = this._key.toString();
o.someParam = someString;
o.someParam2 = someInt;
o.someParam3 = [someString1, someString2, someString3];
...
Он добавляется к нашему объекту события (который мы используем для определения события, которое нужно вызвать, данных и т. Д. Для передачи). Объект события зарегистрирован как псевдоним класса
Этот объект отправляется на сервер через сокет следующим образом:
myByteArray.writeObject( eventObj );
myByteArray.compress();
mySocket.writeBytes( myByteArray );
mySocket.flush();
На стороне сервера мы получаем байты и распаковываем их. Мы создаем объект Amf3Input и устанавливаем входной поток, затем читаем его:
Amf3Input amf3Input = new Amf3Input( mySerializationContext );
amf3Input.setInputStream( new ByteArrayInputStream( buffer ) ); // buffer is a byte[]
MyEventObj eventObj = (MyEventObj)amf3Input.readObject(); // MyEventObj is the server version of the client event object
Если происходит сбой с «неизвестной ошибкой типа AMF», это происходит немедленно, т. Е. Когда мы пытаемся прочитать объект, а не когда он пытается прочитать подобъект.
При пошаговом просмотре кода чтения, когда я передаю массив объектов, кажется, что если длина <= 4, он считывает длину правильно. Если длина больше, чем это, это читает его длину как 4. </p>