2012-12-21 14 views
8

Ho visto un numero di domande che non rispondono a questo, è possibile controllare la larghezza di banda di qualcuno usando lo script java e caricare il contenuto specifico basato su di esso?Controllo della larghezza di banda di qualcuno e caricamento del contenuto basato su di esso

La BBC sembra darmi immagini di bassa qualità quando si utilizza il mio cellulare e nel bel mezzo del nulla.

dall'aspetto di questo questo interessante servizio fa questo ed è un CDN in modo che potrebbe essere lato server.

http://www.resrc.it/docs/

Qualcuno sa come lo fanno? o come potrei farlo usando asp.net o javascript, o un plug in opensource della comunità.

Penso che sia possibile con https://github.com/yahoo/boomerang/ ma non sono sicuro che questo sia il suo vero scopo.

+0

E quando si utilizza il cellulare e si è nel mezzo della civiltà cosa succede? Sai a cosa serve un utente-agente? –

+0

sì, carica immagini di qualità migliore, questo su un blackberry. – Paul

+2

Dal browser o dall'app? Se stai usando un'app ... accederà alle informazioni dell'hardware, alla potenza del segnale e alla tecnologia utilizzata per connettersi alla rete (2G, 3G, LTE, WiFi), quindi l'app in questo caso può decidere quanta banda consumerà. A proposito, il browser è anche un'app, quindi, beh ... Meglio testarlo con il tuo laptop, un modem USB e un browser in mezzo al nulla e dire se funziona ancora. –

risposta

6

Fondamentalmente si esegue questa operazione in questo modo:

  • avviare un timer
  • caricare un file fisso formato ad esempio un immagine attraverso una chiamata AJAX
  • Arrestare il timer
  • Prendete alcuni campioni e calcolare la media badwidth

somethign lik e questo potrebbe funzionare:

//http://upload.wikimedia.org/wikipedia/commons/5/51/Google.png 
//Size = 238 KB 
function measureBW(cnt, cb) { 
    var start = new Date().getTime(); 
    var bandwidth; 
    var i = 0; 
    (function rec() { 
     var xmlHttp = new XMLHttpRequest(); 
     xmlHttp.open('GET', 'http://upload.wikimedia.org/wikipedia/commons/5/51/Google.png', true); 

     xmlHttp.onreadystatechange = function() { 
      if (xmlHttp.readyState == 4) { 
       var x = new Date().getTime() - start; 
       bw = Number(((238/(x/1000)))); 
       bandwidth = ((bandwidth || bw) + bw)/2; 
       i++; 
       if (i < cnt) { 
       start = new Date().getTime();rec(); 
       } 
       else cb(bandwidth.toFixed(0)); 
      } 
     }; 
     xmlHttp.send(null); 
    })(); 

} 

measureBW(10, function (e) { 
    console.log(e); 
}); 

Non che var xmlHttp = new XMLHttpRequest(); non funziona su tutti i browser, si dovrebbe verificare per l'UserAgent e utilizzare quello giusto

E, naturalmente, il suo solo un valore stimato.

Ecco un esempio JSBin

+0

Questa soluzione è più accurata della mia! – Greg

+0

@ c5h8nnao4 .. L-glutammato monosodico :)) – agpt

+0

Disabilitare la memorizzazione nella cache prima di provare questo. Oppure, come per esempio, la prima richiesta verrebbe scaricata dal server remoto e il resto delle richieste verrebbe fornito dalla cache. –

2
  1. Avviare un timer.
  2. Invia una richiesta AJAX al server, richiedendo un file di dimensioni note.
  3. Quando la richiesta AJAX ha terminato il caricamento, interrompere il timer e calcolare la larghezza di banda dal tempo trascorso e dalle dimensioni del file.

Il problema con JavaScript è che gli utenti possono disabilitarlo. (Che è più comune sui telefoni, che capita di essere meglio con le immagini più piccole)

+0

Questo funzionerebbe ma potrebbe basare questo su una richiesta Ajax ad un certo punto nel tempo essere rischioso, il tuo il server potrebbe essere sotto carico o la rete dei client potrebbe essere occupata. Penso che sarebbe bello farlo più di una volta e basare il contenuto sulla larghezza di banda media. – Paul

+1

@Paul: questo è un punto giusto. Tuttavia, lato client, non si desidera attendere l'acquisizione delle immagini dopo avere dati di larghezza di banda "stabili". Suggerirei di caricare le immagini con JavaScript, aggiungere un listener di eventi "load" a queste immagini, calcolare la larghezza di banda e archiviare localmente la larghezza di banda. In questo modo puoi iniziare a caricare alcune piccole immagini, ottenere una larghezza di banda media e modificare dinamicamente le immagini caricate. – Cerbrus

+1

Pensi che funzionerà? Fai lo stesso sul lato server usando il tuo gestore HTTP per i file speciali "knonw-size". Avvia il timer sul lato server, apri il file di test (ad esempio il logo del tuo sito principale) e invialo scrivendo nel flusso di output. Una volta raggiunto l'EOF (il client ha terminato il caricamento del contenuto), interrompi il timer. –

2

Ho bussato this up sulla base di temporizzazione download di immagini (rif: http://www.ehow.com/how_5804819_detect-connection-speed-javascript.html)

parola di avvertimento, però:

Si dice che la mia velocità è 1.81Mbps,

Ma secondo SpeedTest.Net mia velocità sono questo:

enter image description here

La logica di temporizzare il download sembra giusto, ma non so se si tratta di preciso?

+0

Questa è la differenza a causa delle regioni del server speedtest.net colpisce sempre le tue regioni locali mentre aws.amazon.com può trovarsi in regioni diverse. –

1

Beh, come ho detto nei miei commenti, è possibile scegliere 2 approcci:

1) Sei nel contesto di un'applicazione mobile, quindi è possibile interrogare la tecnologia utilizzata dal dispositivo direttamente in modo da poter notificare il server direttamente quale tipo (e dimensione) di contenuto è in grado di rendere. Penso che il divario telefonico possa aiutarti ad accedere ad alcune delle API mobili native utilizzando JavaScript.

2) La cosa del timer del server. Puoi "servire" alcuni file tu stesso, diciamo che hai un file magico nella tua pagina di destinazione, che, non appena il client richiede il file, prendi questa richiesta HTTP con un gestore personalizzato. "Manualmente" servi il file scrivendo nel flusso di output, e tu misuri i byte inviati e il tempo impiegato per raggiungere l'EOF, quindi puoi in qualche modo misurare la larghezza di banda. Combina questo con il cookie di sessione e disponi di queste informazioni per browser collegato.

0

Sebbene questa non sia una risposta, potrebbe essere importante notare che misurare la larghezza di banda non è sempre affidabile.

http://www.smashingmagazine.com/2013/01/09/bandwidth-media-queries-we-dont-need-em/

parafrasando quanto sopra:

... il numero di bit trasferiti diviso per il tempo necessario per scaricarli ... è vero quando si scarica un file di grandi dimensioni su un singola connessione TCP riscaldata. Questo è raramente il caso. tipico scenario di caricamento della pagina:

  1. pagina HTML iniziale viene caricata tramite meccanismo di slow-start, in modo da misura sarà significativamente sottovalutare la larghezza di banda disponibile
  2. CSS e JavaScript risorse esterne vengono caricati - una raccolta di nuove connessioni TCP, tutto nella loro fase di avvio lento, e non sono tutti necessariamente sullo stesso server di destinazione
  3. Le immagini vengono caricate: più connessioni, ognuna delle quali scarica una risorsa. Il problema è che queste connessioni non sono sempre nella stessa fase del loro ciclo di vita. Alcuni potrebbero essere nella fase di avvio lento; alcuni potrebbero aver subito una perdita di pacchetti e, quindi, hanno ridotto la finestra e la larghezza di banda che stanno cercando di riempire; e alcuni potrebbero essere connessioni TCP riscaldate, pronte per riempire la larghezza di banda. Queste connessioni TCP non sono necessariamente tutte sullo stesso server di destinazione e la larghezza di banda verso i vari server di destinazione potrebbe essere diversa l'una dall'altra.

Quindi, è possibile stimare la larghezza di banda, ma è tutt'altro che semplice ed è possibile solo per alcune fasi del processo di caricamento della pagina. E poiché avere diverse connessioni TCP a vari server di destinazione è comune (ad esempio, un CDN potrebbe ospitare le risorse di immagine di una pagina Web), non possiamo davvero stabilire quale sia la larghezza di banda che vogliamo misurare.

Poiché si tratta di una questione più grande, la proposta alternativa, alla fine di questo articolo è quello di considerare il più recente, srcset attribute per le immagini sensibili, che permette al browser decidere quale risorsa per carico in base a tutto ciò che conosce (che dovrebbe essere più di noi). Sembra it's weighted more towards just determining resolution, ma forse diventerà più intelligente man mano che il supporto aumenta.

0

ho rilasciato BwCh che è un open-source JavaScript API per rilevare la larghezza di banda per gli ambienti basati su Web

E 'costruito con ES2015. Utilizza alcune delle ultime innovazioni JavaScript (window.navigator.connection attualmente supportate in Chrome 48+ per Android a partire da aprile 2016) al fine di fornire un metodo flessibile per rilevare la larghezza di banda per dispositivi mobili e desktop. È un fallback/complemento al pre-caricamento delle immagini per rilevare la larghezza di banda laddove quelle API più recenti non sono disponibili.