2010-11-08 15 views
5

W mojej aplikacji Java, jak wykryć szybkość połączenia internetowego? Na przykład, używam AT & T Szybka DSL w domu, zastanawiam się, czy istnieje sposób mogę napisać metodę, która wykonuje następujące operacje:Jak wykryć prędkość połączenia internetowego z Javą?

int getInternetConnectionSpeed() 
{ 
    ... 
} 

Który powróci liczbę w kbps, coś 2800kbps [2.8 M]

Edytuj: Edycja: Powód, o który pytam, jest w mojej aplikacji, mogę otworzyć wiele strumieni internetowych, w zależności od prędkości połączenia internetowego użytkownika, chcę, aby automatycznie określał, ile strumieni ma się otworzyć bez klinowania Aplikacja.

+0

Myślę, że tak naprawdę działa, musicie mieć serwer po drugiej stronie testu, który może obsłużyć prędkości wyższe niż maksymalny limit połączenia AT & T ... – FrustratedWithFormsDesigner

+0

Nawet jeśli można uzyskać "oficjalne" "prędkość połączenia dla Internetu użytkownika, numer ten byłby szalenie nieścisły w większości scenariuszy w świecie rzeczywistym. Być może powinieneś dokładnie rozważyć, dlaczego potrzebujesz tych informacji i znaleźć inny sposób robienia tego, co właśnie robisz * naprawdę * próbujesz zrobić. – Randolpho

+0

Czy przepustowość Twoich "strumieni" jest ograniczona, czy może uda Ci się pobrać 1 strumień tak szybko, jak to możliwe, w porównaniu z 10 pobieranymi strumieniami tak szybko, jak to tylko możliwe (w takim przypadku prawie nic nie zyskasz) – nos

Odpowiedz

2

Myślę, że można pomyśleć o problemie w niewłaściwy sposób. Zrobienie migawki szybkości połączenia jest tylko wskaźnikiem ich przepustowości w danym momencie. Mogą dość łatwo uruchomić inną aplikację, gdy uruchomisz test, który zasysa ich przepustowość, a twoje zmierzone wartości są bezwartościowe.

Zamiast tego, myślę, że powinieneś stale dodawać lub usuwać wątki w zależności od tego, czy zwiększa lub zmniejsza ich przepustowość. Sugeruję coś podobnego (tylko pseudo kod):

while(true) { 
    double speedBeforeAdding = getCurrentSpeed(); 
    addThread(); 
    // Wait for speed to stabilise 
    sleep(20 seconds); 
    double speedAfterAdding = getCurrentSpeed(); 
    if(speedAfterAdding < speedBeforeAdding) { 
    // Undo the addition of the new thread 
    removeThread(); 
    // Wait for speed to stabilise 
    sleep(20 seconds); 

    if(getNumberOfThreads() > 1) { 
     double speedBeforeRemoving = getCurrentSpeed(); 
     // Remove a thread because maybe there's too many 
     removeThread(); 
     // Wait for speed to stabilise 
     sleep(20 seconds); 
     double speedAfterRemoving = getCurrentSpeed(); 
     if(speedAfterRemoving < speedBeforeRemoving) { 
     // Add the thread back 
     addThread(); 
     // Wait for speed to stabilise 
     sleep(20 seconds); 
     } 
    } 
    } 
} 

Możesz dopasować czasy snu do własnych potrzeb. Zakładam, że getCurrentSpeed() zwraca przepustowość wszystkich wątków pobierania i można dynamicznie otwierać i zamykać wątki podczas wykonywania aplikacji.

+2

Dzięki, to jeden sprytny sposób na skórze kota! – Frank

+0

Prawdopodobnie chcesz użyć puli wątków do zarządzania wątkami. – Holly

1

Czas, ile czasu zajmuje pobranie pliku o znanym (i wystarczająco dużym) rozmiarze.

Jeśli pobieranie 60 MB trwa 10 sekund, masz połączenie (10 * 1024 * 8/60) Kbps lub 1365 Kbps.

+2

Niestety, wystarczyłoby ustalić szybkość połączenia z serwerem, z którego plik został pobrany, a nie ogólną prędkość przesyłania danych na poziomie łącza, której pożądany jest oryginalny plakat. – Randolpho

+0

... tak, co powiedział Randolpho. – FrustratedWithFormsDesigner

+1

@Randolpho: Zrobiłbyś to dla serwera, z którym chciałbyś się komunikować. Wszystkie inne prędkości łącza są nieistotne. –

1

Ale istnieje wiele prędkości w zależności od tego, gdzie chcesz się połączyć:

  • 127.0.0.1?
  • Twoja lokalna podsieć?
  • Twój internet?

Ponieważ JVM używa lokalnego komputera PC, który korzysta z lokalnej sieci, nie ma możliwości automatycznego uzyskania prędkości DSL.

Aha, i proszę zauważyć, że możesz nawet surfować long distance!

Powiązane problemy