2012-12-21 23 views
8

Widziałem wiele pytań, które nie odpowiadają na to pytanie, czy możliwe jest sprawdzenie przepustowości czyjegoś za pomocą skryptu java i załadowanie określonej zawartości na podstawie tego?Sprawdzanie przepustowości czyjegoś i ładowanie treści na podstawie tego

BBC wydaje mi się niskiej jakości obrazy podczas korzystania z telefonu komórkowego i w szczerym polu.

przez wygląd tej tej fajnej usługi robi to i jej CDN, aby mógł być po stronie serwera.

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

Czy ktoś wie jak to zrobić? lub jak mogłem to zrobić za pomocą asp.net lub javascript lub wtyczki opensource społeczności.

Myślę, że to może być możliwe z https://github.com/yahoo/boomerang/, ale nie jestem pewien, czy jest to jego prawdziwy cel.

+0

A kiedy używasz telefonu komórkowego i jesteś w środku cywilizacji, co się dzieje? Czy wiesz, do czego służy użytkownik-agent? –

+0

tak, ładuje obrazy lepszej jakości, to na blackberry. – Paul

+2

W przeglądarce lub w aplikacji? Jeśli używasz aplikacji ... będzie ona uzyskiwać dostęp do informacji o sprzęcie, mocy sygnału i technologii używanej do łączenia się z siecią (2G, 3G, LTE, WiFi), więc aplikacja w tym przypadku może zdecydować, ile przepustowości zużyje. Nawiasem mówiąc, przeglądarka jest również aplikacją, więc, cóż ... Lepiej przetestuj ją za pomocą laptopa, modemu USB i przeglądarki w środku pustkowia i powiedz, czy nadal działa. –

Odpowiedz

6

W zasadzie można to zrobić tak:

  • start timer
  • Załaduj plik wielkość stałą np obrazu poprzez wywołanie ajax
  • zatrzymać stoper
  • Weź kilka próbek i obliczyć średnią badwidth

somethign lik e to może działać:

//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); 
}); 

Nie żeby var xmlHttp = new XMLHttpRequest(); nie będzie działać na wszystkich przeglądarkach, należy sprawdzić, czy UserAgent i używać słuszna

i oczywiście jej tylko wartość szacunkowa.

Herezje JSBin przykład

+0

To rozwiązanie jest bardziej dokładne niż moje! – Greg

+0

@ c5h8nnao4 .. L-glutaminian monosodowy :)) – agpt

+0

Wyłącz buforowanie przed wypróbowaniem tego. Lub, jak na przykład, pierwsze żądanie zostanie pobrane ze zdalnego serwera, a pozostałe żądania będą obsługiwane z pamięci podręcznej. –

2
  1. Uruchom minutnik.
  2. Wysyłaj żądanie AJAX do swojego serwera, żądając pliku o znanym rozmiarze.
  3. Po zakończeniu ładowania żądania AJAX zatrzymaj licznik czasu i oblicz przepustowość z podanego czasu i rozmiaru pliku.

Problem z JavaScriptem polega na tym, że użytkownicy mogą go wyłączyć. (Który jest bardziej powszechne na telefonach, które stało się lepiej z mniejszych obrazów)

+0

To działałoby, ale może oprzeć to na jednym żądaniu Ajax w pewnym momencie, być ryzykowne, serwer może być obciążony lub sieć klientów może być zajęta. Myślę, że dobrze byłoby zrobić to więcej niż jeden raz i oprzeć zawartość na średniej przepustowości. – Paul

+1

@Paul: To słuszne. Jednak po stronie klienta nie chcesz czekać na pobieranie obrazów po "stabilnych" danych o przepustowości. Proponuję załadować obrazy za pomocą JavaScript, dodając detektor zdarzeń "ładowanie" do tych obrazów, obliczyć przepustowość i lokalnie przechowywać przepustowość. W ten sposób możesz rozpocząć ładowanie kilku małych obrazów, uzyskać średnią przepustowość i dynamicznie modyfikować ładowane obrazy. – Cerbrus

+1

Czy uważasz, że to zadziała? Zrób to samo po stronie serwera, używając własnego programu obsługi HTTP dla specjalnych plików "knonw-size". Uruchom licznik czasu po stronie serwera, otwórz plik testowy (np. Logo głównej witryny) i wyślij go, pisząc do strumienia wyjściowego. Po osiągnięciu EOF (klient zakończył ładowanie treści), a następnie zatrzymaj licznik czasu. –

2

Mam zapukał this up oparciu o taktowaniu pobrań (ref: http://www.ehow.com/how_5804819_detect-connection-speed-javascript.html)

słowo ostrzeżenia:

Mówi moja prędkość jest 1.81Mbps,

Ale według SpeedTest.Netto moi prędkości są to:

enter image description here

Logika rozrządu pobieranie wydaje się słuszne, ale nie wiem, czy to jest poprawne?

+0

Taka jest różnica, ponieważ regiony serwera speedtest.net zawsze trafiają do lokalnych regionów, podczas gdy aws.amazon.com może znajdować się w różnych regionach. –

1

Cóż, jak powiedziałem w moich komentarzach, można wybrać 2 podejścia:

1) Jesteś w kontekście aplikacji mobilnej, a następnie można wyszukać technologię wykorzystywaną przez urządzenie bezpośrednio, dzięki czemu można powiadomić serwer bezpośrednio, jaki typ (i rozmiar) treści można renderować. Myślę, że luka między telefonami może pomóc w uzyskaniu dostępu do niektórych natywnych mobilnych API przy użyciu JavaScript.

2) Rzecznik serwera. Możesz "serwować" niektóre pliki samodzielnie, powiedzmy, że masz magiczny plik na stronie docelowej, że gdy tylko klient zażąda pliku, pobierasz to żądanie HTTP za pomocą niestandardowej procedury obsługi. "Ręcznie" serwujesz plik, pisząc do strumienia wyjściowego, mierzysz wysyłane bajty i czas potrzebny na dotarcie do EOF, możesz w jakiś sposób zmierzyć pasmo. Połącz to z plikiem cookie sesji i masz te informacje dla każdej podłączonej przeglądarki.

0

Chociaż nie jest to odpowiedź, ważne może być zwrócenie uwagi, że szerokość pasma pomiarowego nie zawsze jest niezawodna.

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

parafrazując powyżej:

... liczba bitów pobranych podzielony przez czas, jaki zajęło je pobrać ... prawda podczas pobierania dużego pliku ponad pojedyncze rozgrzane połączenie TCP. Tak rzadko się zdarza. Typowy scenariusz ładowania strony:

  1. Początkowa strona HTML jest pobierany za pomocą mechanizmu powolnego startu, więc pomiar znacznie lekceważyć dostępną przepustowość
  2. CSS i JavaScript zasoby zewnętrzne są załadowane - zbiór nowych połączeń TCP, wszystkie w fazie powolnego startu i nie wszystkie są koniecznie do tego samego serwera docelowego.
  3. Obrazy są ładowane - wiele połączeń, z których każdy pobiera zasób. Problem polega na tym, że te połączenia nie zawsze znajdują się w tej samej fazie cyklu życia. Niektórzy mogą być w fazie powolnego startu; niektórzy mogą ponieść straty pakietów, a tym samym zmniejszyć swoje okno i przepustowość, którą próbują wypełnić; a niektóre mogą być rozgrzanymi połączeniami TCP, gotowymi do wypełnienia przepustowości. Te połączenia TCP niekoniecznie należą do tego samego serwera docelowego, a przepustowość w stosunku do różnych serwerów docelowych może się różnić między sobą.

Więc szacowania przepustowości jest możliwe, ale jest daleko od prostych, a to jest możliwe tylko w odniesieniu do niektórych etapów procesu ładowania strony. A ponieważ posiadanie kilku połączeń TCP z różnymi serwerami docelowymi jest powszechne (na przykład sieć CDN może obsługiwać zasoby graficzne strony internetowej), nie jesteśmy w stanie powiedzieć, jaką przepustowość chcemy zmierzyć.

Ponieważ jest to starszy pytanie, alternatywna propozycja na końcu artykułu jest rozważenie bardziej niedawnej srcset attribute dla reagującego obrazowania, która pozwala przeglądarka zdecydować, które atutem załadować na podstawie cokolwiek to wie (który powinien być kimś więcej niż my). To brzmi jak it's weighted more towards just determining resolution, ale może stanie się mądrzejszy, gdy wsparcie wzrośnie.

0

I wydali BwCh który jest open-source JavaScript API do wykrywania przepustowości dla sieciowych środowiskach

Jest zbudowany z ES2015. Korzysta z najnowszej innowacyjnej technologii JavaScript (window.navigator.connection aktualnie obsługiwanej w Chrome 48+ na Androida od kwietnia 2016 r.), Aby zapewnić elastyczną metodę wykrywania przepustowości zarówno urządzeń mobilnych, jak i stacjonarnych. To awarie/uzupełnienia wstępnego ładowania obrazu w celu wykrycia przepustowości tam, gdzie te najnowsze API nie są dostępne.