User's collector

Внимание!   Данная опция будет доступна только после того, как вы авторизуетесь.
   запомнить меня 
27 июня 2007

Начало разработки с Red5

Оригинал статьи: Getting Started With Red5 Server
Автор: Milan Toth
Перевод: Алексей «Vooparker» Аникутин

Часть первая — Установка среды

В целом это статья в большей степени посвящена Java, чем ActionScript, однако если ты flash-flex разработчик, то рано или поздно тебе потребуется столкнуться с разработкой проектов под сервер Red5.
Прежде всего, нам потребуется установить сам сервер Red5 версии 0.6 (для успешного завершения этого урока автор предлагает использовать именно эту версию, так изменения между релизами могут быть весьма значительны, со всеми вытекающими отсюда последствиями. Прим. переводчика — на версии 0.6.1 полет нормальный).

Нам также в этом уроке потребуется Eclipse, если у тебя его еще до сих пор нет, тогда тебе сюда. Устанавливаем и Eclipse и Red5 в «штатном» режиме. Так же было бы не плохо обзавестись XMLBuddy), плагином к Eclipse, он будет нам полезен для редактирования конфигурационных xml-файлов. Устанавливается просто — копированием в папку [Eclipse_HOME]/plugings. Так же там потребуется Adobe Flex Builder 2, автор предлагает установить его в качестве плагина к существующей установке Eclipse, поскольку очень удобно разрабатывать и серверную и клиентскую часть не переключаясь с одной среды разработки на другую.

Если у вас не установлено ни JRE, ни JDK вам придется их установить. Взять их можно здесь. Вам также придется разобраться с java CLASSPATH, за подробностями можете обращаться на страницы Sun.

И так настало время ознакомиться с корневой директорией установки Red5: red5.jar содержит необходимые классы для разработки под red5, в директории webapps располагаются наши приложения. Jetty servlet container ищет приложения в этой директории по конфигурационным xml-файлам, расположенных в папках WEB-INF.

Мы можем создать наше red5 приложение многими способами. Мы можем использовать Apache Ant для компиляции нашего приложения, основанного на red5/build.xml, но этот способ сложнее. Мы воспользуемся Eclipse’ом для написания и компиляции нашего приложения, после чего запустим Red5.

Запускаем Eclipse, кликаем по пункту меню File → New Project, выбираем Java Project, в качестве названия вводим Red5FirstApp и нажимаем Finish.

В виде Package Explorer появился только что созданный проект с библиотекой классов установленной в системе JRE. Кликаем правой кнопкой по проекту, New → Folder, называем директорию WEB-INF. В только что созданной WEB-INF создаем папки classes и src.

Теперь скажем Eclipse, что в качестве корневой директории для наших исходных файлов будет использовать папка WEB-INF/src, для этого правый клик на ней Build Path → Use as Source Folder.

Для хранения скомпилированных классов мы должны установить директорию WEB-INF/classes. Для этого кликаем пункт Project → Properties. Выбираем Java Build Path → вкладка Source. В самом низу находим Default Output Folder, нажимаем Choose и выбираем WEB-INF/classes.

И так мы почти готовы, осталось последнее — расположить конфигурационный файлы. Открываем папку [red5_HOME]/doc/templates/myapp/WEB-INF и копируем все 4 файла в [Eclipse_Workspace]/Red5FirstApp/WEB-INF. После чего переключаемся в Eclipse, правым кликом на проекте и выбираем Refresh, после чего скопированные файлы появятся в проекте.

Часть вторая – Написание простого приложения

И так все готово для того, чтобы приступить к написанию нового приложения. Правый клик на WEB-INF/src, выбираем New → Class, в качестве пакета указываем com.milgra, в качестве имени класса — Application, после чего нажимаем Finish. Созданный нами класс появится в редакторе.

Этот класс и будет основным классом нашего приложения, однако для этого необходимо чтобы он наследовался от класса ApplicationAdapter, входящего в библиотеку red5. Так что для начала нам потребуется добавиться эту библиотеку к проекту. Кликаем пункт Project → Properties, выбираем Java Build Path, затем вкладку Libraries и нажимаем Add External JARs, находим red5.jar директории установки Red5. Теперь Eclipse сможет скомпилировать наше приложение и подсказывать нам.

Сначала создадим два метода appStart и appStop:

JAVA:
  1. package com.milgra;
  2. import org.red5.server.adapter.ApplicationAdapter;
  3. public class Application extends ApplicationAdapter
  4. {
  5.     public boolean appStart ( )
  6.     {
  7.  
  8.     }
  9.     public void appStop ( )
  10.     {
  11.  
  12.     }
  13. }

Было бы не плохо отследить клиентское соединение, для этого нам потребуется импортировать новый класс:

JAVA:
  1. import org.red5.server.api.IConnection;

Теперь мы можем добавить еще два метода:

JAVA:
  1. public boolean appConnect( IConnection conn , Object[] params )
  2. {
  3.     return true;
  4. }
  5.  
  6. public void appDisconnect( IConnection conn , Object[] params )
  7. {
  8.  
  9. }

Для отладки нашего приложения мы воспользуемся логгингом, мы создадим логгер, который будет выводить сообщения в стандартный аутпут. Так что давайте импортируем классы Log и LogFactory:

JAVA:
  1. import org.apache.commons.logging.Log;
  2. import org.apache.commons.logging.LogFactory;

Eclipse укажет на ошибки в этих строках, все потому что мы не импортировали соответствующую библиотеку. Так что давайте сделаем это. Кликаем Project → Properties. Раздел Java Build Path, вкладка Libraries. Нажимаем Add External JARs и выбираем commons-logging-1.1.jar в директории [red5_HOME]/lib и нажимаем OK.

Дополним наш класс:

JAVA:
  1. private static final Log log = LogFactory.getLog( Application.class );
  2.  
  3. public boolean appStart ( )
  4. {
  5.     log.info( "Red5First.appStart" );
  6.     return true;
  7. }
  8.  
  9. public void appStop ( )
  10. {
  11.     log.info( "Red5First.appStop" );
  12. }
  13.  
  14. public boolean appConnect( IConnection conn , Object[] params )
  15. {
  16.     log.info( "Red5First.appConnect " + conn.getClient().getId() );
  17.     return true;
  18. }
  19.  
  20. public void appDisconnect( IConnection conn , Object[] params )
  21. {
  22.     log.info( "Red5First.appDisconnect " + conn.getClient().getId() );
  23. }

Так как наша задача сделать простой пример, то и логика приложения будет такой же простой, если мы передаем true серверу при соединении, мы позволяем клиентскому приложению подключиться, в противном случае, сервер отклонит попытку соединения.

JAVA:
  1. private static final Log log = LogFactory.getLog( Application.class );
  2.  
  3. public boolean appStart ( )
  4. {
  5.     log.info( "Red5First.appStart" );
  6.     return true;
  7. }
  8.  
  9. public void appStop ( )
  10. {
  11.     log.info( "Red5First.appStop" );
  12. }
  13.  
  14. public boolean appConnect( IConnection conn , Object[] params )
  15. {
  16.     log.info( "Red5First.appConnect " + conn.getClient().getId() );
  17.  
  18.     boolean accept = (Boolean)params[0];
  19.  
  20.     if ( !accept ) rejectClient( "you passed false..." );
  21.  
  22.     return true;
  23. }
  24.  
  25. public void appDisconnect( IConnection conn , Object[] params )
  26. {
  27.     log.info( "Red5First.appDisconnect " + conn.getClient().getId() );
  28. }<

Итоговый код должен выглядеть так:

JAVA:
  1. package com.milgra;
  2.  
  3. import org.apache.commons.logging.Log;
  4. import org.apache.commons.logging.LogFactory;
  5.  
  6. import org.red5.server.api.IConnection;
  7. import org.red5.server.adapter.ApplicationAdapter;
  8.  
  9. public class Application extends ApplicationAdapter
  10. {
  11.     private static final Log log = LogFactory.getLog( Application.class );
  12.  
  13.     public boolean appStart ( )
  14.     {
  15.         log.info( "Red5First.appStart" );
  16.         return true;
  17.     }
  18.  
  19.     public void appStop ( )
  20.     {
  21.         log.info( "Red5First.appStop" );
  22.     }
  23.  
  24.     public boolean appConnect( IConnection conn , Object[] params )
  25.     {
  26.         log.info( "Red5First.appConnect " + conn.getClient().getId() );
  27.  
  28.         boolean accept = (Boolean)params[0];
  29.  
  30.         if ( !accept ) rejectClient( "you passed false..." );
  31.  
  32.         return true;
  33.     }
  34.  
  35.     public void appDisconnect( IConnection conn , Object[] params )
  36.     {
  37.         log.info( "Red5First.appDisconnect " + conn.getClient().getId() );
  38.     }
  39. }

И так мы полностью разобрались с Java. Все что нам осталось это разобраться с конфигурационными файлами. Так что, все наше вниманием теперь четырем файлам в папке WEB-INF.

  • log4j.properties:
    параметры логгинга нашего приложения;
  • red5-web.properties:
    этот файл инклудится red5-web.xml, постоянные параметры могут располагаются здесь. webapp.contextPath хранит в себе путь к нашему приложению (не стоит писать в начале пути webapps), установим значение этого параметра на firstapp:

    CODE:
    1. webapp.contextPath=/firstapp
    2. webapp.virtualHosts=localhost, 127.0.0.1

    теперь файл можно сохранить.

  • red5-web.xml:
    Spring загружает и конфигурирует наше приложение основываясь на этом файле. Bean обработчики также могут располагаться здесь.
    В этом файле находим web.handler и в значение атрибута class вписываем путь до нашего приложения:

    XML:
    1. <bean id="web.handler"
    2.         class="com.milgra.Application"
    3.         singleton="true" />

    Также можете удалить myhandler.service, так в нашем случае нам он не потребуется.

  • web.xml:
    Это файл будет прочитан Jetty первым. Переименуйте приложение здесь в firstapp, и удалите две секции в которых описывается gateway.

    XML:
    1. <context -param>
    2.     <param -name>webAppRootKey</param>
    3.     <param -value>/firstapp</param>
    4. </context>

Ну что ж теперь можно собрать наш проект. Project → Build Automatically, теперь Eclipse будет перекомпиливать проект после каждого изменения, что не может не радовать.

Последний шаг — установка приложения на сервер. Создайте новую директорию в папке red5/webapps и назовите ее firstapp (это имя мы указывали в файле red5-web.properties). И скопируйте в эту директорию WEB-INF из [Eclipse_Workspace]/Red5FirstApp. Теперь запускаем сервер red5 и наше приложение готово.

Часть третья — Создание клиентского flash-приложения

И так серверная часть готова, настало время опробовать ее в работе.

И так переключаемся во Flex Builder, создаем новый Actionscript project и называем его Red5FirstClient:

Actionscript:
  1. package
  2. {
  3.  
  4.     import flash.net.NetConnection;
  5.     import flash.net.ObjectEncoding;
  6.     import flash.events.NetStatusEvent;
  7.     import flash.display.Sprite;
  8.  
  9.     public class Red5FirstClient extends Sprite
  10.     {
  11.  
  12.         private var nc:NetConnection;
  13.  
  14.         public function Red5FirstClient()
  15.         {
  16.  
  17.             // new netconnection
  18.  
  19.             nc = new NetConnection( );
  20.  
  21.             // set encoding to old amf
  22.  
  23.             nc.objectEncoding = ObjectEncoding.AMF0;
  24.  
  25.             // netstatus event listening
  26.  
  27.             nc.addEventListener( NetStatusEvent.NET_STATUS , netStatus );
  28.  
  29.             // connect to red5, passing false as parameter
  30.  
  31.             nc.connect( "rtmp://localhost/firstapp" , false );
  32.  
  33.         }
  34.  
  35.         private function netStatus ( event:NetStatusEvent ):void
  36.         {
  37.  
  38.             trace( event.info.code );
  39.  
  40.             if ( event.info.code == "NetConnection.Connect.Rejected" )
  41.             {
  42.  
  43.                 // trace reject message
  44.  
  45.                 trace( event.info.application );
  46.  
  47.             }
  48.  
  49.         }
  50.  
  51.     }
  52.  
  53. }

Теперь кликаем Run → Debug. Так как в качестве параметра при соединении мы передали false, red5-приложение отклонит попытку, а в логе появиться строка:

[INFO] 87028 pool-2-thread-8:( com.milgra.Application.appConnect ) Red5First.appConnect 1

Что означает, что наше клиентское приложение подключилось к серверу. Теперь проверим flex-консоль:

CODE:
  1. NetConnection.Connect.Rejected
  2. you passed false . . .
  3. NetConnection.Connect.Closed

Серверное приложение отклонило соединение, а также передало сообщение, то есть оно работает так, как мы и планировали.
Теперь изменим значение параметра передаваемого при соединении на true, и посмотрим что произойдет:

Actionscript:
  1. nc.connect( "rtmp://localhost/firstapp" , true );

в консоле мы увидим:

CODE:
  1. NetConnection.Connect.Success

А это означает, что наше приложение работает! :)

UPD: Файлы к статье "Начало разработки с Red5"

Теги:


31 комментарий к записи:

hades [ 8 ноября , 2007 в 14:03 ]

Привет!
После компиляции проекта в Eclipse(3.3.1.1) появляется файл .class, переношу всё это хозяйство в red5(0.6.2) правлю файлы и в итоге:
NetConnection.Connect.InvalidApp
NetConnection.Connect.Closed
[SWF] D:\Adobe\eclipse\workspace\red5client\bin\red5client.swf - 1 632 bytes after decompression

или

NetConnection.Connect.Failed
[SWF] D:\Adobe\eclipse\workspace\red5client\bin\red5client.swf - 1 632 bytes after decompression

Vooparker [ 8 ноября , 2007 в 17:51 ]

Мне честно говоря сложно судить, чем вызвана неработоспособность вашего приложения. В процессе перевода я проработал весь приведенный в статье код и он вполне работоспособен. Могу допустить, что это связано с

...сервер Red5 версии 0.6 (для успешного завершения этого урока автор предлагает использовать именно эту версию, так изменения между релизами могут быть весьма значительны, со всеми вытекающими отсюда последствиями. Прим. переводчика — на версии 0.6.1 полет нормальный).

denka [ 9 ноября , 2007 в 16:50 ]

А можно поподробнее как вы удаленный дебаг настраивали?

hades [ 10 ноября , 2007 в 12:22 ]

Это всё происходит на локальной машине

denka [ 10 ноября , 2007 в 12:48 ]

поп подробнее можно
какие настройки у red5 что он в дебаг моде работал

hades [ 10 ноября , 2007 в 13:05 ]

Блин. Я тока начал. Не нападайте ))).
Скачал ред, флексБилдер в обоих вариантах(stand+plug), еклипс, ант. поставил, настроил всё по НЕМНОГОЧИСЛЕННЫМ мануалам, и такой вот результат. Попытался через JAR с параметрами -cvf собрать приложение, но толку мало.
Если возможно, опишите plz последовательность, как собрать приложение для ред5 по шагам.
ЗЫ: Сижу на WinXP т.к. конечная цель сервер Win2003.

ALiEN [ 12 ноября , 2007 в 20:34 ]

Такая же проблема как и у hades =(

Первая попытка:

NetConnection.Connect.InvalidApp
NetConnection.Connect.Closed

Затем:

NetConnection.Connect.Failed

Vooparker [ 12 ноября , 2007 в 23:59 ]

2hades и 2ALiEN:
Повторюсь, с выходом версии 0.6.2 возможно произошли какие-то изменения по сравнению с предыдущими версиями. Весь приведенный в статье код я проверял и на версии 0.6.1 никаких ошибок не наблюдается. Поставить себе сейчас 0.6.2 нет возможности =(. На всякий случай в конце статьи прикрепил архив с файлами, которые у меня работают без ошибок.

ALiEN [ 14 ноября , 2007 в 22:05 ]

2Vooparker Спасибо за файлы, поковыряю обязательно! Но! Пока ждал ответа вот написал для начинающих, и всех у кого проблема с ред5 небольшой пошаговый хелп =))

kaban4igg(megaglupij_nik))) [ 16 ноября , 2007 в 23:30 ]

что-то у вас столько мучений...

заметил одно отличие (я уже успел написать свой аппликэйшн)

я не использовал никакого com.milgra, а использовал все аналогично уже другим приложениям РЕД5

C:\Program Files\Red5\webapps\try0511\WEB-INF\src\org\red5\server\webapp\try0511
вот тут у меня хранятся исходники.

package org.red5.server.webapp.try0511;
так называется мой пэкэдж.

Пробуйте :)

hades [ 17 ноября , 2007 в 11:41 ]

А приложение в каком формате на выходе получается? .class ИЛИ .jar ?

Vooparker [ 17 ноября , 2007 в 16:12 ]

2kaban4igg(megaglupij_nik)))
не вижу никаких причин в данной ситуации, по которым пакет может влиять на работоспособность приложения.

2hades
в конце статьи есть ссылка на архив с рабочими файлами к данной статье. К сожалению более не чем не могу вам помочь.

Noer [ 2 декабря , 2007 в 15:38 ]

У самого была подобная проблема.
Разобрался!!!

В ява консоли на серваке пишет java.lang.UnsupportedClassVersionError: Bad version number in .class

это потому что Eclipse компилит по умолчанию в яве 1.6

а на сервере стоИт 1.5

чтоб исправить ошибку в Eclispe- Project properties - java compiler - enable project specific settings - compliance version - ставим 5
компилируем, переписываем получившийся .class в ред5 , перезапускаем ред5

удач

Antonos [ 3 января , 2008 в 14:38 ]

у меня таже проблема
Первая попытка:
NetConnection.Connect.InvalidApp
NetConnection.Connect.Closed
Затем:
NetConnection.Connect.Failed

пробывал откомпилить под 1.5
пробую конектиться к удалённому хосту: rtmp://80.67.26.8:8787/oflaDemo
в файрволе все нужные порты открыты

даже не знаю в чём может быть проблема

помогите пожалуйста

anchar [ 7 августа , 2008 в 23:37 ]

уберите все log.info( );
откомпилируйте занова
положите файлы в нужную папку на сервере
перезапустите сервер

у меня тоже сначала вылезала NetConnection.Connect.InvalidApp, а теперь все ок!)

Alexey [ 12 августа , 2008 в 18:59 ]

Здравствуйте, Многоуважаемые Коллеги.
Извиняюсь что задаю столь глупый вопрос, но мне интересна следующая
ситуация. Предположим на сервере есть определенное количество mp3 либо
видео файлов.

Можно ли и сделать так что бы сервер вещал эти файлы в realtime, что
то на подобии online радио, причем желательно без посторонней помощи.

Либо же если первое не возможно то как сделать так что бы клиент
посылал на сервер звуковой поток (mp3 файл либо другой формат),
остальные же к нему подключались?

Буду благодарен за любую помощь!!!

Спасибо!!!

Noer [ 12 августа , 2008 в 20:42 ]

все это возможно
надо только код написать
читай доки

на счет ошибки которая обсуждалась выше, может я невнятно написал , но суть в том, чтобы ява машина на сервере и ява класс который вы скомпилили имели одинаковую версию

(если на серваке стоИт 1.5 то и компилить надо под ява 1.5 а никак не другой - если на локалке с Эклипсом к примеру стоИт 1.6 то надо вытащить 1.5 и выбрать в опциях при компиляции ее)

Vadim [ 2 октября , 2008 в 14:25 ]

требуется флешер кто умеет работать с red5 -необходимо доработать на видеочате его

пишите 386042

starline [ 15 октября , 2008 в 23:10 ]
kubioq [ 24 декабря , 2008 в 21:20 ]

Все работает и ниибет:)
Сначала пробовал на RED5 0.6.0, ошибка как у ALiEN.
После установки RED5 0.6.1 все стало ОК.
У меня вопрос. Как захватить видео поток с Веб камеры с помощью Flash Player'a?

Юрий Яровой [ 24 декабря , 2008 в 21:42 ]

Я думаю, что нужно обратиться к документации по классу flash.media.Camera. ;-)

Girevik [ 2 февраля , 2009 в 12:01 ]

а подскажите клиентскую часть можно оформить на java??

Girevik [ 2 февраля , 2009 в 14:00 ]

Vooparker,
объясни плиз, в прикрепленом к статье архиве 2 папки - as3 и red5 - куда нужно разложить их содержимое??
и что сделать что-бы проверить работоспособность этого примера??

ixter [ 2 марта , 2009 в 14:11 ]

Установил Red5, но когда пытаюсь запустить пример
rtmp://localhost:1935/oflaDemo
браузер пишет что не может октрыть страницу

ajax [ 5 марта , 2009 в 15:54 ]

rtmp протокол не для браузера
его можно ввести сюды
http://localhost:5080/demos/publisher.html

ixter [ 14 марта , 2009 в 17:24 ]

Не сразу заработало, однако в поиске причины помог лог запуска сервера

Юрий Яровой [ 17 апреля , 2009 в 18:18 ]

Еще статья на русском о Red 5: http://dot-bobrovod.habrahabr.ru/blog/55934/.

PugBlolla [ 18 мая , 2009 в 23:47 ]

Работаю менеджером. Хочу сделать интернет магазин. Порекомендуйте человека или организацию, кто поможет мне в этом. Главное чтоб человек, который его делает был адекватный и недорого.

Юрий Яровой [ 19 мая , 2009 в 00:51 ]

Честно говоря не хочу за кого-либо поручаться. Попробуйте поискать кого-нибудь на фрилансерских сайтах. Или пообщайтесь со знакомыми на эту тему — может быть кто-нибудь из них тоже стоял перед подобной проблемой.

Евген [ 9 января , 2010 в 20:46 ]

А как можно организовать приват в чате на red5? Можно как-то отправлять сообщение не всем, кто подключен к комнате, а только конкретному пользователю?

Илья Задорожко [ 25 марта , 2010 в 18:42 ]

Евген - я делаю так:

JAVA:
  1. public void send_private(String fromPseudo, String DestinationID,String msg) {
  2.         for (Set<IConnection> cons : conCollection) {
  3.             for (IConnection conn : cons) {
  4.                 if (conn != null){
  5.                     String id=conn.getClient().getId();
  6.                     if (!(DestinationID.equals(id))) continue;
  7.                     if (conn instanceof IServiceCapableConnection) {
  8.                         ((IServiceCapableConnection) conn).invoke("receivePrivateMsg", new Object[]{fromPseudo, msg});
  9.                     }   
  10.                 }
  11.             }
  12.         }
  13.     }

Оставьте свой комментарий:

Имя: *
* — обязательно для заполнения
Электропочта: *
Сайт:
Сообщение *
Коментировать
Коментировать