Просмотр полной версии : XMLSocket as3+java
Здравствуйте!
Дано:
клиент as3 на XMLSocket'е;
сервер java;
Задача:
1) Принять от клиента XML файл, извлечь из него название тэга, название его атрибута и значение атрибута (<element attribute = value />).
Далее будет соответственная обработка полученных данных.
2) Также необходимо сформировать такой же XML файл, но уже с другими данными и отослать клиенту для последующей их обработки уже на его стороне.
Проблема:
На стороне клиента, вроде все понятно, благо E4X есть, и собственно XMLSocket'ы. А вот на JAVA... Ну совсем уж запутался. Какие принтеры, райтеры, буфферы, ридеры и как использовать, не знаю уж.
gloomyBrain
06.11.2013, 17:32
Вам, наверное, вот на этот (http://javatalks.ru) форум.
gloomyBrain, спасибо за ссылку, конечно. Я тем временем копаю в интернете инфу, но шибко это все запутано.
Всё же хотелось бы получить ответ от флешеров, наверняка кто-то сталкивался с данным вопросом.
caseyryan
06.11.2013, 19:35
А в чем конкретно вопрос-то?
Я вот вижу
Ну совсем уж запутался. Какие принтеры, райтеры, буфферы, ридеры и как использовать, не знаю уж.
Но это совсем не вопрос.
caseyryan, в таком уж случае прошу цитировать целое выражение. Из чего будет очевидно, что проблема с реализацией задачи на джаве.
caseyryan
06.11.2013, 22:13
Так в чем конкретно проблема? Хотите чтобы это сделали за вас? Тогда вам в раздел "вакансии".
Сразу скажу, что эта задача на джаве не решается в 5 - 10 строк, и даже в 100.
Во-первых работа с XML в джаве гораздо более сложная, чем в ас3. Во-вторых для подключения флеш клиента к сокет серверу, нужно создать дополнительный класс, который будет мониторить запросы флеш плеера на файл политик и отдавать ему этот файл. Задача, казалось бы, не очень сложная, но новички это часто игнорируют, и не понимают почему не коннектится.
Показывайте, что именно не получается сделать, а там уж поможем.
Были ли хоть какие-то попытки разобраться самостоятельно?
п.с. В нете полно примеров java + as3. Могу скинуть скинуть одну из первых версий моего сокет сервера на джаве, в котором реализовано только подключение клиентов. Но кода там дофига, и вряд ли он прояснит ситуацию
Ну да, всего навсего сделать сокет-сервер на java. Не зная java.
PainKiller
07.11.2013, 12:01
Почему обязательно сокет-сервер? Можно сделать простой http сервлет, который в ответ на запрос будет отдавать эксемельник
Ну если не нужен сокет, тогда всё проще, конечно.
Советую Spark (http://www.sparkjava.com/), хороший фреймворк для создания REST-сервисов, в нем уже встроен Jetty, не нужно будет заморачиваться серверами и контейнерами сервлетов.
P.S.
Если это не важно - можно попробовать Jersey, для него есть пример XML-сериализации (http://www.techzoo.org/how-to/restful-java-web-service-with-xml-response.html), хотя её можно использовать и в связке со Spark.
caseyryan
07.11.2013, 12:24
Почему обязательно сокет-сервер? Можно сделать простой http сервлет, который в ответ на запрос будет отдавать эксемельник
Ох как серьезно задача-то упростилась )
[КЭП]его сделать ни чуть не проще, чем сокет сервер[/КЭП]
....Сразу скажу, что эта задача на джаве не решается в 5 - 10 строк, и даже в 100....
В таком случае, вы должны понимать мои затруднения. Тем более, когда пытаешься разобраться во всем сам. К сожалению, найти какой-нибудь мануал который покажет именно то, что тебе нужно, да и всё объяснит — весьма нелегко, а то и невозможно.
Вот моя реализация сервера:
- Для чтения данных из сокетов использую InputStreamReader + BufferedReader;
- Далее, данные из буфера передаю в стороковую переменную (метод readLine());
- Создаю Document в который считываю байты и парсю эту самую строковую переменную;
- В переменную типа Element извлекаю из документа элемент;
- Потом, к примеру, могу у элемента извлечь название тэга методом getTagName(); что уже позволит мне передать элемент в нужную цепочку к дальнейшей обработке (извлечения значений атрибутов).
Добавлю, что передаваемый xml файл очень простой, предположительно всего один тэг с атрибутами.
Тэг служит пунктом назначения (то есть в какую цепочку отправить), а атрибуты уже содержат данные необходимые для обработки.
Следственно... Конкретизируя мой вопрос:
- Правильные ли я выбрал стримы-ридеры? Если нет, то какие лучше и почему? (я немного запутался в этом вопросе)
- Приемлемый ли выбор принимать данные в строку, а потом преобразоть её в документ? Есть ли возможность передавать данные сразу в документ (соответственно отпарсив); быстрее ли будет обработка данных?
- Всё-таки, DOM или SAX? (хотя лично, SAX ещё не пробовал).
- Эффективный ли данный метод в общем(для данной задачи), да в эффективности обработки данных и простоте реализации в частности? Или есть лучше? Почему? Как правильно реализовать?
P.S.: на джава-талке так никто и не ответил. :)
PainKiller
09.11.2013, 19:37
Ох как серьезно задача-то упростилась )
Я не пробовал написать сокет-сервер на яве, но моих скромных познаний в яве хватило чтобы поставить томкет и написать написать первый сервлет в течении полутора часов. Это упрощает задачу уже хотя бы потому что проще с безопасностью, не будет серькюрити эррор. Но все зависит от задачи, если нужно возвращать не сложный хмл то это быстро реализует даже новичок, если там нужно воротить что то серьезное, то это совсем другое дело.
Ресмус
Если с англ. все ок, то я рекомендую Basham B., Sierra K., Bates B . - Head First Servlets and JSP (2nd Edition) (A Brain-Friendly Guide) - 2008 шикарная книга, просто и с юмором написана, я её сейчас читаю, и реально быстро начинаешь делать сложные серверные вещи. А если с англ. напряг то попробуй на javabegin.ru, там есть платные курсы по вебяве. А иначе никак писать явакод не научишся, учиться надо полюбому :-)
- Правильные ли я выбрал стримы-ридеры? Если нет, то какие лучше и почему? (я немного запутался в этом вопросе)
эти то работают? С клиента данные идут? Это все проверяется на практике
SAX я тоже не пробовал, ничего сказать не могу.
Не доводилось использовать XMLSocket, но если он работает по тому же принципу, что и Socket, то использование сервлета в качестве серверного решения не кажется верным. Сервлеты работают по принципу "запрос-ответ", логичнее было бы использовать URLLoader и на сервере - какой-то фреймворк для реализации REST API, построенный на сервлетах(в целях экономии времени, хотя никто не запрещает создать свою реализацию серверного API). Либо использовать ServerSocket на серверной стороне и работать в режиме постоянного подключения, если это требуется спецификой приложения, конечно. Да, в таком случае желательно использовать не XML(порядочное количество избыточных данных), а, скажем, AMF - он понятен Flash-у, и существуют готовые решения на Java для декодировании и сериализации. Например, можно использовать BlazeDS (http://sourceforge.net/adobe/blazeds/wiki/Home/)(нужны библиотеки flex-messaging-common.jar и flex-messaging-core.jar). Читаем:
Amf3Input in = new Amf3Input(SerializationContext.getSerializationContext());
in.setInputStream(clientSocket.getInputStream());
Object message = in.readObject();
Пишем:
AmfObject message = new AmfObject();
Amf3Output out = new Amf3Output(SerializationContext.getSerializationContext());
out.setOutputStream(clientSocket.getOutputStream());
out.writeObject(message);
out.writeObjectEnd();
out.flush();
В клиенте читаем данные при помощи socket.readObject()...есть еще проблема с буферизацией больших сообщений, но до неё еще добраться нужно, решается чтением в промежуточный ByteArray для буферизации собщений. Ну и еще нужно создать класс-модель для сериализации (http://livedocs.adobe.com/blazeds/1/blazeds_devguide/help.html?content=serialize_data_3.html).
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.