Calculando a taxa de transferencia com FlashCom/Flash Media Server

Com o Flash Media Server você tem a possibilidade de calcular a taxa de transferencia e saber que tipo de conexão o usuário está usando. Podendo determinar para qual aplicação ele deve ser direcionado por exemplo.

no Flash Media Server/Flash Communication Server há dois métodos para tratar da largura de banda usada.

getBandwidthLimit(direção) – você obtem a velocidade de banda do usuario. É possivel passar dois parametros especificos. “direção” é um inteiro que determina o caminho da conexão: 0(zero) indica do cliente para o servidor e 1(um) indica do servidor para o cliente.

no main.asc por exemplo:

ActionScript

  1. application.onConnect = function(client){
  2. var clientToServer= client.getBandwidthLimit(0);
  3. var serverToClient= client.getBandwidthLimit(1);
  4. };

setBandwidthLimit(iServerToClient, iClientToServer) – você determina a largura máxima da conexão do cliente como cliente para servidor e do servidor para o cliente ou ambos. O valor (em bytes por segundo) padrão é setado no arquivo Application.xml não podendo ser excedido.
o seguinte codigo cria um combo box com os valores das conexões(Deixe um combo box na biblioteca do filme):

ActionScript

  1. client_nc = new NetConnection();
  2. _root.createClassObject(mx.controls.ComboBox,"speed_cb", 1);
  3. _root.speed_cb.addItem("Modem", {up:33, down:33});
  4. _root.speed_cb.addItem("DSL", {up:100, down:400});
  5. _root.speed_cb.addItem("LAN", {up:1000, down:1000});
  6. var listBand:Object = new Object();
  7. listBand.change = function(evt:Object):Void  {
  8.     var selected = _root.speed_cb.value;
  9.     client_nc.call("setMyBandwidth", null, selected.up, selected.down);
  10. };
  11. _root.speed_cb.addEventListener("change", listBand);

e no main.asc

ActionScript

  1. application.onConnect = function(newClient){
  2.     newClient.setMyBandwidth = function (clientToServer, serverToClient) {
  3.         this.setBandwidthLimit(1000*serverToClient/8, 1000*clientToServer/8);
  4.     trace("\tsetBandwidthLimit:("+1000*serverToClient/8+", "+1000*clientToServer/8+")");
  5.     };
  6. }

caso queira algo mais elaborado pode utilizar a classe criada pelo Giacomo ‘Peldi’
http://www.peldi.com/blog/downloads/bwcheck.as
ou o codigo que vem nos arquivos de exemplo do proprio Flash 8.

/*
file main.asc
Copyright 2004 Macromedia, Inc. All rights reserved.
The following is Sample Code and is subject to all restrictions
on such code as contained in the Macromedia Flash Communication
Server MX 1.5 End User License Agreement .
*/

application.onConnect = function(p_client, p_autoSenseBW)
{
//Add security here

this.acceptConnection(p_client);

if (p_autoSenseBW)
this.calculateClientBw(p_client);
else
p_client.call(“onBWDone”);
}

Client.prototype.getStreamLength = function(p_streamName) {
return Stream.length(p_streamName);
}

Client.prototype.checkBandwidth = function() {
application.calculateClientBw(this);
}

application.calculateClientBw = function(p_client)
{

p_client.payload = new Array();
for (var i=0; i<1200; i++){
p_client.payload[i] = Math.random(); //16K approx
}

var res = new Object();
res.latency = 0;
res.cumLatency = 1;
res.bwTime = 0;
res.count = 0;
res.sent = 0;
res.client = p_client;
var stats = p_client.getStats();
var now = (new Date()).getTime()/1;
res.pakSent = new Array();
res.pakRecv = new Array();
res.beginningValues = {b_down:stats.bytes_out, b_up:stats.bytes_in, time:now};
res.onResult = function(p_val) {

var now = (new Date()).getTime()/1;
this.pakRecv[this.count] = now;
//trace( “Packet interval = ” + (this.pakRecv[this.count] – this.pakSent[this.count])*1 );
this.count++;
var timePassed = (now – this.beginningValues.time);

if (this.count == 1) {
this.latency = Math.min(timePassed, 800);
this.latency = Math.max(this.latency, 10);
}

//trace(“count = ” + this.count + “, sent = ” + this.sent + “, timePassed = ” + timePassed);

// If we have a hi-speed network with low latency send more to determine
// better bandwidth numbers, send no more than 6 packets
if ( this.count == 2 && (timePassed<2000))
{
this.pakSent[res.sent++] = now;
this.cumLatency++;
this.client.call(“onBWCheck”, res, this.client.payload);
}
else if ( this.sent == this.count )
{
// See if we need to normalize latency
if ( this.latency >= 100 )
{ // make sure we detect sattelite and modem correctly
if ( this.pakRecv[1] – this.pakRecv[0] > 1000 )
{
this.latency = 100;
}
}

delete this.client.payload;
// Got back responses for all the packets compute the bandwidth.
var stats = this.client.getStats();
var deltaDown = (stats.bytes_out – this.beginningValues.b_down)*8/1000;
var deltaTime = ((now – this.beginningValues.time) – (this.latency * this.cumLatency) )/1000;
if ( deltaTime < = 0 ) deltaTime = (now - this.beginningValues.time)/1000; var kbitDown = Math.round(deltaDown/deltaTime); trace("onBWDone: kbitDown = " + kbitDown + ", deltaDown= " + deltaDown + ", deltaTime = " + deltaTime + ", latency = " + this.latency + "KBytes " + (stats.bytes_out - this.beginningValues.b_down)/1024) ; this.client.call("onBWDone", null, kbitDown, deltaDown, deltaTime, this.latency ); } } res.pakSent[res.sent++] = now; p_client.call("onBWCheck", res, ""); res.pakSent[res.sent++] = now; p_client.call("onBWCheck", res, p_client.payload); }[/as] *breve postarem um artigo sobre como fazer isso no RED5

Flash, Flash Media Server, Flash Remoting, Principal, RIA

1 comment


  1. hum… Red5! isso vai ser muito interessante.

Leave a Reply