Оригинал статьи: 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:
-
package com.milgra;
-
import org.red5.server.adapter.ApplicationAdapter;
-
public class Application extends ApplicationAdapter
-
{
-
public boolean appStart ( )
-
{
-
-
}
-
public void appStop ( )
-
{
-
-
}
-
}
Было бы не плохо отследить клиентское соединение, для этого нам потребуется импортировать новый класс:
-
import org.red5.server.api.IConnection;
Теперь мы можем добавить еще два метода:
Для отладки нашего приложения мы воспользуемся логгингом, мы создадим логгер, который будет выводить сообщения в стандартный аутпут. Так что давайте импортируем классы Log и LogFactory:
-
import org.apache.commons.logging.Log;
-
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.
Дополним наш класс:
-
private static final Log log = LogFactory.getLog( Application.class );
-
-
public boolean appStart ( )
-
{
-
log.info( "Red5First.appStart" );
-
return true;
-
}
-
-
public void appStop ( )
-
{
-
log.info( "Red5First.appStop" );
-
}
-
-
{
-
log.info( "Red5First.appConnect " + conn.getClient().getId() );
-
return true;
-
}
-
-
{
-
log.info( "Red5First.appDisconnect " + conn.getClient().getId() );
-
}
Так как наша задача сделать простой пример, то и логика приложения будет такой же простой, если мы передаем true серверу при соединении, мы позволяем клиентскому приложению подключиться, в противном случае, сервер отклонит попытку соединения.
-
private static final Log log = LogFactory.getLog( Application.class );
-
-
public boolean appStart ( )
-
{
-
log.info( "Red5First.appStart" );
-
return true;
-
}
-
-
public void appStop ( )
-
{
-
log.info( "Red5First.appStop" );
-
}
-
-
{
-
log.info( "Red5First.appConnect " + conn.getClient().getId() );
-
-
-
if ( !accept ) rejectClient( "you passed false..." );
-
-
return true;
-
}
-
-
{
-
log.info( "Red5First.appDisconnect " + conn.getClient().getId() );
-
}<
Итоговый код должен выглядеть так:
-
package com.milgra;
-
-
import org.apache.commons.logging.Log;
-
import org.apache.commons.logging.LogFactory;
-
-
import org.red5.server.api.IConnection;
-
import org.red5.server.adapter.ApplicationAdapter;
-
-
public class Application extends ApplicationAdapter
-
{
-
private static final Log log = LogFactory.getLog( Application.class );
-
-
public boolean appStart ( )
-
{
-
log.info( "Red5First.appStart" );
-
return true;
-
}
-
-
public void appStop ( )
-
{
-
log.info( "Red5First.appStop" );
-
}
-
-
{
-
log.info( "Red5First.appConnect " + conn.getClient().getId() );
-
-
-
if ( !accept ) rejectClient( "you passed false..." );
-
-
return true;
-
}
-
-
{
-
log.info( "Red5First.appDisconnect " + conn.getClient().getId() );
-
}
-
}
И так мы полностью разобрались с Java. Все что нам осталось это разобраться с конфигурационными файлами. Так что, все наше вниманием теперь четырем файлам в папке WEB-INF.
- log4j.properties:
параметры логгинга нашего приложения; - red5-web.properties:
этот файл инклудится red5-web.xml, постоянные параметры могут располагаются здесь.webapp.contextPathхранит в себе путь к нашему приложению (не стоит писать в начале пути webapps), установим значение этого параметра наfirstapp:CODE:-
webapp.contextPath=/firstapp
-
webapp.virtualHosts=localhost, 127.0.0.1
теперь файл можно сохранить.
-
- red5-web.xml:
Spring загружает и конфигурирует наше приложение основываясь на этом файле. Bean обработчики также могут располагаться здесь.
В этом файле находимweb.handlerи в значение атрибута class вписываем путь до нашего приложения:XML:-
<bean id="web.handler"
-
class="com.milgra.Application"
-
singleton="true" />
Также можете удалить myhandler.service, так в нашем случае нам он не потребуется.
-
- web.xml:
Это файл будет прочитан Jetty первым. Переименуйте приложение здесь вfirstapp, и удалите две секции в которых описывается gateway.XML:-
<context -param>
-
<param -name>webAppRootKey</param>
-
<param -value>/firstapp</param>
-
</context>
-
Ну что ж теперь можно собрать наш проект. Project → Build Automatically, теперь Eclipse будет перекомпиливать проект после каждого изменения, что не может не радовать.
Последний шаг — установка приложения на сервер. Создайте новую директорию в папке red5/webapps и назовите ее firstapp (это имя мы указывали в файле red5-web.properties). И скопируйте в эту директорию WEB-INF из [Eclipse_Workspace]/Red5FirstApp. Теперь запускаем сервер red5 и наше приложение готово.
Часть третья — Создание клиентского flash-приложения
И так серверная часть готова, настало время опробовать ее в работе.
И так переключаемся во Flex Builder, создаем новый Actionscript project и называем его Red5FirstClient:
-
package
-
{
-
-
import flash.net.NetConnection;
-
import flash.net.ObjectEncoding;
-
import flash.events.NetStatusEvent;
-
import flash.display.Sprite;
-
-
public class Red5FirstClient extends Sprite
-
{
-
-
private var nc:NetConnection;
-
-
public function Red5FirstClient()
-
{
-
-
// new netconnection
-
-
nc = new NetConnection( );
-
-
// set encoding to old amf
-
-
nc.objectEncoding = ObjectEncoding.AMF0;
-
-
// netstatus event listening
-
-
nc.addEventListener( NetStatusEvent.NET_STATUS , netStatus );
-
-
// connect to red5, passing false as parameter
-
-
nc.connect( "rtmp://localhost/firstapp" , false );
-
-
}
-
-
private function netStatus ( event:NetStatusEvent ):void
-
{
-
-
trace( event.info.code );
-
-
if ( event.info.code == "NetConnection.Connect.Rejected" )
-
{
-
-
// trace reject message
-
-
trace( event.info.application );
-
-
}
-
-
}
-
-
}
-
-
}
Теперь кликаем Run → Debug. Так как в качестве параметра при соединении мы передали false, red5-приложение отклонит попытку, а в логе появиться строка:
[INFO] 87028 pool-2-thread-8:( com.milgra.Application.appConnect ) Red5First.appConnect 1
Что означает, что наше клиентское приложение подключилось к серверу. Теперь проверим flex-консоль:
-
NetConnection.Connect.Rejected
-
you passed false . . .
-
NetConnection.Connect.Closed
Серверное приложение отклонило соединение, а также передало сообщение, то есть оно работает так, как мы и планировали.
Теперь изменим значение параметра передаваемого при соединении на true, и посмотрим что произойдет:
-
nc.connect( "rtmp://localhost/firstapp" , true );
в консоле мы увидим:
-
NetConnection.Connect.Success
А это означает, что наше приложение работает!




Привет!
После компиляции проекта в 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