Met de lancering van de Adobe Flash Player 10, biedt deze nu ook ondersteuning voor een nieuw protocol dat door Adobe zal ingevoerd worden namelijk: rtmfp.
RTMFP, of voluit: Real Time Media Flow Protocol, is een nieuw protocol dat developers in staat stelt peer 2 peer communicatie op te zetten tussen 2 (of meerdere) flash player instanties.
Dit heeft vooral als voordeel dat de belasting op de server heel minimaal blijft, het verkeer gebeurt namelijk enkel tussen de clients. Voor een volledig overzicht van wat de voor-en nadelen kan je best volgende PDF lezen.
Nu wat heeft dit met ‘Stratus’ te maken? Wel Stratus is een service, die zoals de titel doet vermoeden, voorlopig in beta is. Dit is een door Adobe gehoste service die via RTMFP werkt. Dus iedereen die een Adobe ID heeft kan opteren voor een Developer Key en zo de functionaliteit testen.
Op Adobe Labs staat verder informatie over Adobe Stratus.
Het voorbeeld dat door Adobe meegeleverd is vond ik zeer onduidelijk dus voelde ik me verplicht een eenvoudige test/demo applicatie te maken.
De applicatie is een chat applicatie die de standaard flow illustreert maar daarnaast ook de mogelijkheid bezit om tot een maximum van vijf deelnemers op te nemen. Om te connecteren dient men twee instanties van de link to openen en deze door middel van de unieke ID die gegenereerd wordt bij het opstarten van de app met elkaar te laten communiceren (copy paste de unieke id van een client in het “Connect to client” input veld van de andere client).
Dit voorbeeld heb ik gemaakt in Flex (view-source.enabled = true) wat volgens mij de workflow een beetje vereenvoudigd. Het voorbeeld is voorzien van commentaar zodat het duidelijk wordt welke stappen allemaal moet gebeuren.
Chat app
Opmerkingen:
De reden waarom de applicatie maar een totaal van 5 clients aankan is omdat de NetConnection.maxPeerConnections default op 8 staat, deze 8 zijn als volgt gedefinieerd:
- 1 NetStream die luisterd naar inkomende connecties
- 4 NetStream objecten die luisteren naar inkomende boodschappen van de andere 4 clients
- 1 NetStream die verantwoordelijk is voor uitgaande boodschappen
- 1 NetStream die wordt gebruikt om te connecteren op een andere client
Dit heeft een totaal van 7 streams echter als de 6e client probeert te connecteren creëert de andere client nog een Stream waarna hij zijn maximum aan streams heeft bereikt en dus de applicatie breekt.
Ook niet te vergeten voor RTMP te laten werken dient je netwerk uitgaand UDP verkeer toe te laten.
Niet te vergeten dat dit voorbeeld een puur technische test is op basis van de Stratus service. Feedback is welkom!
De List control in Flex 3 beschikt over de mogelijkheid de scrollbar te beïnvloeden. Dit is echter beperkt tot horizontalScrollPolicy & verticalScrollPolicy. Met deze twee property’s kan je bepalen of je de scrollBar al dan niet toont.
Maar ik wou – bij het aanpassen van een item uit de list – niet dat de scrollBar zou verdwijnen, maar disabled zou worden. Dit resultaat heb ik bereikt door gebruik te maken van volgende methode:
var lSubtitles:CustomList = new CustomList();
lSubtitles.enableScrollBar(false);
// Invalidate the CustomList so the applications knows
// he needs to refresh the list
lSubtitles.invalidateList();
De klasse:
package classes.views.subtitles.list
{
import flash.events.Event;
import flash.events.MouseEvent;
import mx.controls.List;
import mx.controls.scrollClasses.ScrollBar;
// This custom list is programmed to be able to disable
// the scrollbar which is by default impossible.
// This is a useful addition to the current
// functionality of ScrollPolicy OFF|ON|AUTO
// (which hides/shows the scrollbar)
public class CustomList extends List
{
private var _bEnabledScrollBar:Boolean = true;
// Constructor
public function CustomList()
{
super();
}
// Function to set whether the scrollbar should
// be put enabled or disabled
public function enableScrollBar(bValue:Boolean):void
{
_bEnabledScrollBar = bValue;
if(!bValue)
{
// This is the event which is triggered when a
// user scrolls with his mouse wheel.
// Check if this object has such an event listener
if(super.hasEventListener(MouseEvent.MOUSE_WHEEL))
{
// This is the protected event handler which
// resides inside the ListBase
super.removeEventListener(MouseEvent.MOUSE_WHEEL,
mouseWheelHandler);
}
}
else
{
// This is the event which is triggered when a user
// scrolls with his mouse wheel. Make sure this
// doesn't has such an event listener
if(!super.hasEventListener(MouseEvent.MOUSE_WHEEL))
{
// This is the protected event handler which
// resides inside the ListBase
super.addEventListener(MouseEvent.MOUSE_WHEEL,
mouseWheelHandler);
}
}
}
// The configure scrollbar method manages
// the functionality of the scrollbars this method
// get's called when the invalidateDisplayList is called
protected override function configureScrollBars():void
{
// If the _bDisabledScrollBar boolean is set to true;
// the scrollbar should be disabled!
if(!_bEnabledScrollBar)
{
// Loop trough the children of the list and
// find the scrollbar
for(var t:int = 0; t < this.numChildren; t++)
{
if(this.getChildAt(t) is ScrollBar)
{
var sb:ScrollBar = this.getChildAt(t) as ScrollBar;
sb.enabled = false;
sb.mouseEnabled = false;
this.mouseEnabled = false;
}
}
}
// Else just use the default behavior of the list
else
{
super.configureScrollBars();
}
}
}
}
Een screenshot van het resultaat:
