Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Flash(AS3) -> Java, Socket 
:(
    Опции темы
C4Grey
  Дата 4.7.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 23.5.2007

Репутация: нет
Всего: 1



Приветствую.
Пытаюсь отправить объект на Java-сервер. Со стандартными типами работает нормально, но с классами начинаются проблемы. Класс сериализирован(и в Java, и в AS), клиент на Java успешно отправляет объект, сервер принимает. При отправке же объекта с Flash-клиента получаю на сервере ошибку:

java.io.StreamCorruptedException: invalid stream header: 0A071744

Ошибку получаю при попытке создания входного потока:

Код

try
{
   objectIn = new ObjectInputStream(socket.getInputStream());                
}
catch(StreamCorruptedException e)
{
   System.out.println("Input Error: " + e.toString());
}


Подскажите, пожалуйста, в чем может быть проблема.
PM MAIL   Вверх
Stolzen
Дата 4.7.2011, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: нет
Всего: 48



В вашем случае лучше использовать сериализацию в XML, я думаю. 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
LSD
Дата 4.7.2011, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Вместо своих велосипедов используй BlazeDS.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
C4Grey
Дата 4.7.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 23.5.2007

Репутация: нет
Всего: 1



Спасибо за советы, но цель именно в том, чтобы разобратся в пересылке объектов в связке Flash <-> Javа, посредством, так сказать, педалей родного велосипеда.
PM MAIL   Вверх
LSD
Дата 4.7.2011, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(C4Grey @  4.7.2011,  17:44 Найти цитируемый пост)
Спасибо за советы, но цель именно в том, чтобы разобратся в пересылке объектов в связке Flash <-> Javа, посредством, так сказать, педалей родного велосипеда. 

Ну тогда начни с того, что разберись с тем как работает сериализация в Java и в Flex (подсказка: они работают по разному и несовместимы между собой). А затем реши какая тебе больше нравится, и допиливай противоположную сторону.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
C4Grey
Дата 5.7.2011, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 23.5.2007

Репутация: нет
Всего: 1



Ясно, спасибо за ответы.
PM MAIL   Вверх
C4Grey
Дата 5.7.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 23.5.2007

Репутация: нет
Всего: 1



По твоему совету почитал несколько статей о сериализаций AMF - объектов, также скачал BlazeDS, погуглил примеры чтения объектов...все сводится к тому же:

Код

objectIn = new ObjectInputStream(socket.getInputStream());
amf3Input = new Amf3Input(SerializationContext.getSerializationContext());
amf3Input.setInputStream(objectIn);


Но ошибка-то у меня именно в создании экземпляра ObjectInputStream, при чтении заголовка:

java.io.StreamCorruptedException: invalid stream header: 0A071744
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)

 У BlazeDS есть какие-то аналоги классов потоков и сокетов?
PM MAIL   Вверх
LSD
Дата 5.7.2011, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



BlazeDS сериализует объекты в AMF формат. На стороне Java для сериализации/десериализации используются Amf3Output/Amf3Input классы. Со стороны Flex - IDataInput.readObject()/IDataOutput.writeObject().


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
C4Grey
Дата 5.7.2011, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 23.5.2007

Репутация: нет
Всего: 1



Да, я уже понял, я сглупил и не тот параметр в качестве входного потока ему выдавал, спасибо.
У меня теперь новая проблема - сервер не может найти класс для десириализации:

flex.messaging.MessageException: Cannot create class of type 'DataMessage'. Type 'DataMessage' not found.

Это исключение получаю при попытке прочесть объект( amf3Input.readObject() ). От blazeDS импользую только 2 файла: flex-messaging-common.jar и flex-messaging-core.jar, вво флешке пропсиано    [RemoteClass(alias="DataMessage")] и есть регистрация: registerClassAlias("DataMessage", DataMessage);, нужный класс в пакете сервера на Java тоже есть, называется так же, поля те же.

P.S. Уже разобрался, во флеше надо было добавить название пакета в registerClassAlias.

Это сообщение отредактировал(а) C4Grey - 5.7.2011, 19:56
PM MAIL   Вверх
C4Grey
Дата 5.7.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 23.5.2007

Репутация: нет
Всего: 1



Ну, теперь сервер все читает корректно...на досуге надо будет почитать исходники blazeDS, чтобы понять как они парсер написали, но пока более приземленные дела - отправка сообщений.
Увы, просто:
Код

amf3Output.writeObject(OutputMessage);
 
не проходит, клиент выдает ошибку Error #2030: End of File detected. На одном форуме подсмотрел вариант с использованием ByteArrayOutputStream, реализовал у себя:
Код

objectOut = socket.getOutputStream();
byteBuffer= new ByteArrayOutputStream();
amf3Output.setOutputStream(byteBuffer);
amf3Output.setOutputStream(objectOut);

И отправка:
Код
amf3Output.writeObject(OutputMessage);
objectOut.write(byteBuffer.toByteArray());
objectOut.flush();


В итоге первое сообщение читалось отлично, последующие - крякозябрами, заметил что количество байт на входе постоянно растет...добавил byteBuffer.reset();, проблема осталась, кроме того клиент выдавал ошибку Error #2006: Index Out of bound при чтении. В итоге решил таким костылем, в цикле передачи:
Код

byteBuffer = new ByteArrayOutputStream();
amf3Output.setOutputStream(byteBuffer);
amf3Output.writeObject(OutputMessage);
objectOut.write(byteBuffer.toByteArray());
objectOut.flush();

Не знаю, насколько это коректно с точки зрения компилятора Java, но оно хотя бы работает smile ... если я что-то делаю неверно - поправте пожалуйста.
PM MAIL   Вверх
LSD
Дата 6.7.2011, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



AMF добавляет в начало потока служебную информацию: заголовок, номер версии AMF и т.п. В конец тоже может добавляться информация о конце потока (не уверен насчет AMF, но Java сериализация так делает).

Если уж тебе так хочется написать свой велосипед, то возьми технологию сериализации которая изначально предназначена для самостоятельного использования, например Google Orotocol Buffers.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
C4Grey
Дата 7.7.2011, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 23.5.2007

Репутация: нет
Всего: 1



Да с сериализцией все нормально, спасибо тебе за объяснения, теперь разбираюсь со скоростью передачи данных...Раньше делал на UDP(RTMFP), данные передавались между двумя флешками - передавал координаты курсора - скорость была просто-таки идеальной(движение мыши отрисовывалось почти синхронно), с ТСР же начались проблемы. Передача данных на сервер еще более-менее, но вот прием медленный, иногда пакеты теряются, из-за чего движение получается дерганным. В серьезных игрушках используют хитрые алгоритмы синхронизации, сервер отсылает сообщения не сразу, а как-то буферизируя данные...но до такой магии мне еще далеко. Можешь что-то посоветовать, какой-то конкретный алгоритм, подход?
PM MAIL   Вверх
LSD
Дата 7.7.2011, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



ТСР это гарантированная доставка. Если ты передаешь координаты мыши и если старое значение координат не дошло, то и не стоит его повторно передавать. Лучше передать новое значение.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
IDVsbruck
Дата 9.7.2011, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: нет
Всего: 22



Советую скачать GraniteDS - у них как-то все понятнее в исходниках, чем у BlazeDS. Да и с кометом у них как-то получше (когда перешел - свято верил, сейчас затрудняюсь сказать в чем).
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.1044 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.