Molti di voi si saranno domandati come si sviluppi un’applicazione lato server in linguaggio Java che funzioni su Red5. Attenti che questo non è l’unico modo per sviluppare un’applicazione in Red5 poiché il server include un interprete anche per i seguenti linguaggio di scripting: Javascript – version 1.6 (Mozilla Rhino version 1.6 R7), JRuby – version 1.0.1 (Ruby version 1.8.5),Jython – version 2.2 (Python version 2.1), Groovy – version 1.0, Beanshell – version 2.0b4.
Detto ciò, in questo tutorials spiegherò come creare un’applicazione che gira sul server multimediale Red5 in linguaggio Java. La versione che sto utilizzando alla data di stesura di questo tutorial è la 0.9.1. Partiamo dal presupposto che tutte le applicazioni sviluppate con Red5 risiedono all’interno della cartella webapps presente nel direttorio di installazione del server.
La creazione di una nuova applicazione in Red5 si può riassumere in tre fasi:
- Creazione di una nuova cartella in webbapps, nel nostro esempio myApp
- Creazione delle opportune sottocartelle di myApp ed aggiornamento dei file di configurazione server-side
- Creazione e Compilazione di un nuovo progetto Java nell’ambiente di Eclipse
Usare Eclipse non è l’unico modo per compilare un’applicazione con Red5, ce ne sono molti altri, per esempio è possibile compilare la soluzione con il tool ant.
E’ consigliabile partire da un template di applicazione, nelle precedenti versioni di Red5, sotto la cartella doc, era presente un “template” di applicazione da cui si poteva partire copiandone la struttura. Purtroppo nella mia installazione su Windows (e presubilmente anche sulla vostra), questa cartella non c’è più, quindi ho scaricato da svn i sorgenti delle applicazioni di esempio e sono partita copiando quella nominata “test“. Se avete SVN potete prenderla da qui: http://red5.googlecode.com/svn/java/example/trunk/altrimenti nella sezione Download di questo articolo, troverete il template da cui sono partita.
Creiamo la struttura base delle directory
La figura sottostante rappresenta la struttura di un’applicazione in Red5: non è altro che un insieme di cartelle, file di configurazione e file java compilati:

Modificare il file di configurazione red5-web.properties
Apriamo con un qualsiasi editor di testo (Notepad++, PSPAD) il file di configurazione nominato red5-web.properties ed inparticolare andiamo a cambiare la proprietà contextPath:
webapp.virtualHosts=localhost, 127.0.0.1
Modificare il file di configurazione web.xml
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>/myApp</param-value>
</context-param>
Modificare il file di configurazione red5-web.xml
dove it.red5server è la struttura del package utilizzato.
Creazione dell’applicazione in Java
Ora che è pronta la configurazione lato server dell’applicazione, creiamo l’applicazione che interagirà con il nostro client in flash.
src: contiene la cartella che contiene la struttura del nostro package org.xyz.
classes: contiene i file compilati class.
lib: contiene il jar dell’applicazione compilata.
Configuriamo un nuovo progetto su Eclipse
Avviamo Eclipse, menu File -> New -> Project
Scriviamo come nome progetto MyRed5FirstApp ed impostiamo come workspace la cartella WEB-INF della nostra applicazione: C:\Programmi\Red5\webapps\myApp\WEB-INF.

Cliccando su avanti, Eclipse creerà automaticamente la cartella src. Aggiungiamo la cartella classes e la impostiamo come output folder.

Ora andiamo sul tab Libraries e aggiungiamo la libreria di Red5 (red5.jar) altrimenti nulla funzionerà!!!! Allora andiamo su Library -> Add External Jar –> e dalla finestra di dialogo, selezionare, sotto la cartella di installazione di Red5, il file red5.jar.

Ora proviamo a sfogliare la nuova libreria in formato jar e vedremo tutte le API di Red5, come illustrato in figura:

Creiamo un nuovo package cliccando sulla cartella src -> clic dx -> create -> new Package

Creiamo una nuova classe Application che estende ApplicationAdapter:

Ora possiamo iniziare a scrivere la nostra prima applicazione in Java, il primo passo è importare la classe org.red5.server.adapater.ApplicationAdapter ed estendiamo la classe ApplicationAdapter.
import org.red5.server.adapter.ApplicationAdapter;
public class Application extends ApplicationAdapter {
public Boolean appStart(){
return true;
}
public void appStop(){
}
}
Per poter analizzare le connessioni dei client bisogna importare la classe: import org.red5.server.api.IConnection;
Per poter debuggare l’applicazione è necessario aggiungere la libreria slf4j:

Importiamo le classi:
import org.slf4j.LoggerFactory;
Ecco il codice completo dell’applicazione:
Creiamo il file Application.java
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Application extends ApplicationAdapter {
private static final Logger log = LoggerFactory.getLogger( Application.class );
public Boolean appStart(){
log.info("Red5First.appStart" );
return true;
}
public void appStop(){
log.info("Red5First.appStop" );
}
public boolean appConnect(IConnection conn , Object[] params )
{
log.info("Red5First.appConnect " + conn.getClient().getId() );
return true;
}
public void appDisconnect(IConnection conn)
{
log.info("Red5First.appDisconnect " + conn.getClient().getId() );
super.appDisconnect(conn);
}
/**This method will be called from the client. This method will show "Hello World!" on
* *the flash client side .
*/
public String sayHello(Object[] params){
log.info("I got your name:-"+params[0].toString());
return "This is myFirstApp Hello World!" + params[0].toString();
}
}
A questo punto l’applicazione è terminate e Eclipse dovrebbe già averla compilata grazie all’opzione “Build Automatically” e nella cartella classes troverete i file class.

Creiamo l’applicazione Client in Flash
nc.onStatus = function(info){
trace(info.code);
switch(info.code){
case "NetConnection.Connect.Success":
debug_txt.text+="[INFO] Sei connesso all'applicazione myApp \n";
callServer();
break;
case "NetConnection.Connect.Failed":
debug_txt.text+="[FAILED] " + info.application +" \n";
break;
case "NetConnection.Connect.Rejected":
debug_txt.text+="[REJECTED] " + info.application +" \n";
break;
case "NetConnection.Connect.Closed":
debug_txt.text+="[CLOSED] " + info.application +" \n";
break;
}
};
nc.connect("rtmp://localhost/myApp");
function callServer(){
var resultObj:Object = new Object();
nc.call("sayHello", resultObj,"Daniela Remogna aka ~FiMiEtTa~");
resultObj.onResult = function(str){
debug_txt.text+="\n[sayHello] ha restituito: " + str +" \n";
}
}
Riavviate il server Red5 ed eseguite il file Flash, otterrete un risultato simile al seguente:

Pingback: Red5 – Finalmente online il tutorial che spiega come creare una nuova applicazione in Java lato server | Il Blog di Daniela Remogna
Puntualissima comlimenti.
Non sempre ci riesco, ma ci provo
Daniela, dove và a scrivere i log l’applicativo lato server???
E’ necessario configurare il file log4j.properties e utilizzare la libreria log4j nell’applicazione.
Se la classe Application la compilo con javac fa lo stesso?
Se la classe Application la compilo con javac fa lo stesso?
Preferisco non appesantire l S.O. con eclipse o Ant ,dato che gira con poca ram e Hrz
Certamente che va bene lo stesso
basta solo ricordarsi di includere i vari jar e classpath
Ho avuto dei problemi nel compilare questa applicazione, sia su windows che su ubuntu. Sembra che manchino due jar files importanti.
Il primo è slf4j-log412-1.6.0.jar (scaricabile da http://www.slf4j.org/download.html), il secondo è log4j-1.2.16.jar (scaricabile da http://logging.apache.org/log4j/1.2/download.html).
Ho anche sostituito slf4j-api-1.5.0.jar (trovato nella cartella di red5) con slf4j-api-1.6.0.jar (scaricato insieme al pacchetto slf4j dal primo indirizzo).
Ma tu prima avevi incluso il jar slf4j indicato nel penultimo screenshot di questo tutorial?
Si, avevo seguito dettagliatamente la tua guida.
Grazie all’errore fornito dal compilatore di eclipse, sono riuscito a risalire alla soluzione descritta. Esso forniva infatti un link a http://www.slf4j.org/codes.html#StaticLoggerBinder
Ok, probabilmente allora c’è qualcosa di diverso a livello di jar in quella release di red5!
Una nota per gli utenti di linux. Per ovvi motivi legati ai permessi, non è conveniente lavorare con eclipse all’interno della cartella red5/webapps. E’ preferibile lavorare nella propria home e quindi copiare la cartella myApp in red5/webapps.
A tal propostito è utile tenere a mente le seguenti considerazioni:
- accertarsi che l’applicazione sia correttamente compilata e funzioni
- copiare la cartella myApp in red5/webapps (sudo cp -R ~/myApp /usr/share/red5/webapps/)
- accertarsi che l’applicazione sia accessibile ed eseguibile da red5 (sudo chmod -R 700 /usr/share/red5/myApp/ && sudo chown -R _red5 /usr/share/red5/myApp/)
- riavviare il server red5 (sudo /etc/init.d/red5-server restart)
Questi comandi sono stati eseguiti con red5 installato con apt-get su ubuntu 10.10, e potrebbero essere leggermente diversi con altre distro e metodi di installazione.
Ottimi suggerimenti
Ciao, mi chiedevo se è possibile utilizzare un altro player che non sia flash.
Eventualmente se volessi creare una webservice per il protocollo RTMP, hai qualche link da consigliarmi? Ti ringrazio
Ciao!
Scusa per il ritardo, ma la scorsa settimana ho avuto la febbre e non ho + seguito i block.
Prova a guardare qui:
http://dev.rtmpy.org/wiki/RTMP
Ciao, ho un po di domande.
Nella modifica dei file .xml i tag che hai postato vanno aggiunti a quelli che si trovano già nei file oppure i file vanno prima svuotati e poi riempiti con solo i tuoi tag?
Nella modifica di red5-web.xml cosa intendi per:
“dove it.red5server è la struttura del package utilizzato” ?
Domanda generica: con questo server e protocollo, quando andrò a visualizzare il video avrò la possibilità di spostarmi temporalmente nel video per ricevere lo stream dal minutaggio in cui sono interessato? Se no, che tool/software mi consigli?
Grazie in anticipo!
Ciao
I tag vanno svuotati e poi riempiti con le informazioni corrette.
Il package è un modo per organizzare le classi in Java: http://it.wikipedia.org/wiki/Package_(Java)
Si tramite il metodo seek della classe NetConnection è possibile spostarsi ad un determinato minutaggio.
Ciao,
ho seguito la tua procedura ma mi perdo nel momento in cui devo creare il client…
Anche scaricando il client che metti a disposizione nella sezione Download ed eseguendolo ottengo:
[FAILED] undefined
Puoi darmi qualche suggerimento?
Grazie
Ciao,
ho installato per la prima volta Red5 1.0 RC1 su windows vista pro a casa per vedere com’è.
Ho impostato il dominio di rete locale 192.168.1.2, porta 8080 del mio pc così da poter provare applicazioni condivise fra diversi pc in casa.
Tutto ok, vedo gli esempi.
Invece non riesco a far funzionare questo esempio, ottenendo lo stesso errore sulla NetConnection.Connect di domenico nel client flash:
trace di ‘NetConnection.Connect.Failed’
e [FAILED] undefined nel debug_txt
Rispetto alle tue indicazioni, ho dovuto cambiare il package da includere per poter usare le classi Logger e LoggerFactory, che ho trovato nel package com.springsource.slf4j.api-1.6.1.
Per quanto riguarda il debug in generale in red5:
1) Quali sono gli strumenti e le stategie più comuni?
2) C’è un modo per debuggare solo la applicazione lato server direttamente in java da eclipse, prima di implemantare il client flash, in modo da semplificare e rendere graduale lo scenario di debugging?
3) Ho provato a debuggare il dialogo client-server con Charles, che mi rileva 5 richieste HTTP identiche:
POST /open/1 HTTP/1.0
Content-Type: application/x-fcs
User-Agent: Shockwave Flash
Host: 192.168.1.2
Content-Length: 1
Pragma: no-cache
con response vuoto…non riesco a spiegarmi quell’url…
4) Ho provato a connettermi all’esempio Admin Panel con l’address 192.168.1.2 sperando di trovare un applicazione di amministrazione che mi potesse dare qualche indicazione di che cosa succede lato server, ma non sono riuscito a connettermi ottenendo un
NetConnection.Connect.Failed
Insomma, per ora, sconfitto su tutta la linea
Grazie,
Andrea
Aggiorno

L’esempio funziona se riconfiguro il server su 127.0.0.1 in /conf/red5.properties
Quello che avevo fatto precedentemente era sotuituire tutti i 127.0.0.1 con 192.168.1.2 nel file /conf/red5.properties.
La domanda che mi viene è: perchè gli altri esempi funzionano lo stesso anche con il server configurato su 192.168.1.2 e questo esempio no?
C’è qualche parametro di configurazione attinente alle singole applicazioni red5 da tenere in considerazione?
Scusate la raffica di dubbi
Grazie,
Andrea
Ciao sono tornata ora dalle ferie, hai risolto oppure hai ancora dei dubbi?
Ciao, scusa ma non riesco a capire come “compilare” il sorgente per il client flash.
Tutto chiaro per quanto riguarda la parte lato server.
La parte client l’ho sviluppata in Adobe Flash.
Puoi fare una cosa simile anche usando Flash Develop.