Internet Speedtest

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Hallo Zusammen,

weiß jemand, wie ich einen Inernet Speedtest per Programmcode machen könnte ?
Downloadlink & Uplink
Oder gibt da schon was?

Vielen Dank
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Etwas mit bekannter größe runterladen und schauen wie lange es gedauert hat, und analog auch hochladen. Und zum Runter- und Hochladen am besten ein CDN verwenden, so dass immer schnelle Edge-Server in der Nähe des Users stehen. Ich hab hier eine ca. 3 MB/s-Anbindung, aber einige Sachen tröpfeln nur mit 200 Kbyte/s rein, sowas vereitelt die "Messung".
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Campionissimo
User
Beiträge: 102
Registriert: Montag 28. März 2011, 07:50

Danke für die Antwort. Sowas habe ich schon geschrieben. Weiß aber nicht, ob meine Messung so wirklich stimmt. Ich habe mal eine kleine Datei heruntergeladen und eine größere. Dieser Werte unterscheiden sich aber extrem ;(
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Grundsätzlich kann so ein Speedtest eigentlich nur die aktuelle Geschwindigkeit zwischen einem selbst und dem genutzten Server aufzeigen. Dazwischen sind allerdings auch noch einige Zwischenstationen... Somit kann man die tatsächliche Verbindungsgeschwindigkeit nicht wirklich zuverlässig ermitteln.

Also egal wie man es macht, es ist nur ein Näherungswert und einem Momentaufnahme...

Schau dir mal an, wie es http://www.wieistmeineip.de/speedtest/ macht. Ich hab es mal mit Firebug beobachtet:
Es wird eine Anfrage wie http://speedtest-smk.wieistmeineip.de/u ... hp?size=64 per GET an den Server geschickt. Der liefert dann eine HTML Seite mit einer Formular zurück. In einem versteckten Feld sind anscheinend Zufallsdaten mit entsprechender Größe. Das Formular wird dann wieder per POST an den Server gesendet.
Mit Javascript werden die Zeiten aufaddiert.

Irgendwie nicht sonderlich kompliziert. Der JS Code ist auch recht leserlich und nachvollziehbar. Wäre IMHO nicht all zu viel Arbeit das nach zu bauen.

Aber wozu eigentlich?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Hi,
ich benutze folgendes Programm um mir alle zwei Sekunden die Datenrate ausgeben zu lassen.

Code: Alles auswählen

#!/usr/bin/python
import urllib2
import urllib
import time
from datetime import datetime
import sys
import os
 

# Geschwindigkeit messen
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=2, buf=10):
 
f = urllib2.urlopen(url)
tStart = datetime.now()
amount = 0
x = 0
 
while ((len(f.read(buf))==buf) & (x<= 60)):
                tEnd = datetime.now()
dif = (tEnd - tStart).total_seconds()

    
if (dif >= intervall):
                        
# print (time.strftime("%H:%M:%S; ")),((((amount/intervall)/1000.00)*8)/1024), "Mbit/s;"
                        amount = 0
                        tStart = datetime.now()
                        x = x + 1
        
else:
amount = amount + buf
 
try:
measure (buf=1024, intervall=2)
 
 
except  KeyboardInterrupt:
exit(0)

Sobald meine Internetverbindung abbricht erhalte ich folgenden Fehler.

Traceback (most recent call last):

File "./peedneu.py", line 43, in <module>

measure (buf=1024, intervall=2)

File "./Speedneu.py", line 18, in measure

f = urllib2.urlopen(url)

File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen

return opener.open(url, data, timeout)

File "/usr/lib/python2.7/urllib2.py", line 431, in open

response = self._open(req, data)

File "/usr/lib/python2.7/urllib2.py", line 449, in _open

'_open', req)

File "/usr/lib/python2.7/urllib2.py", line 409, in _call_chain

result = func(*args)

File "/usr/lib/python2.7/urllib2.py", line 1227, in http_open

return self.do_open(httplib.HTTPConnection, req)

File "/usr/lib/python2.7/urllib2.py", line 1197, in do_open

raise URLError(err)

urllib2.URLError: <urlopen error [Errno -2] Name or service not known>



Ich würde aber gern eine Ausgabe mit 0Mbit/s haben, bis meine die Downloadrate wieder berechnet werden kann.

Kennt da irgendwer eine Lösung für mein Problem.
Zuletzt geändert von Anonymous am Mittwoch 21. Dezember 2016, 09:48, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Nr8: Die Einrückung in dem Quelltext ist kaputt‽

Die Lösung dürfte mit der Behandlung dieser Ausnahme in Deinem Code zu tun haben.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das bit-weise `&` in der `while` Schleife ist wohl auch falsch... da soll doch wohl an `and` hin, oder?

Gruß, noisefloor
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Ich bekomme aber die Werte, wenn die Internetverbindung steht. Die Probleme treten nur auf, wenn kein Empfang ist.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das das `&` an der Stelle funktioniert liegt auch nur daran, dass z.B. `True & True` das gleiche Ergebnis gibt wie `True and True`. Richtig ist bit-weise Operation trotzdem an der Stelle nicht.

Ansonsten hat BlackJack doch schon das Stichwort gegeben: Exception-Handling der betreffenden Zeile, in der der Fehler auftritt.

Gruß, noisefloor
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Da kenne ich mich leider nicht aus.
Ich würde

try:

f = urllib2.urlopen(URL)

except ???????????

was kommt bei except hin?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Nr8: der Fehler, der auftritt, steht in der letzten Zeile: urllib2.URLError
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Super, ihr seid die Besten!!!!!!!!!!
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Jetzt möchte ich noch gern in der except ein bash-Script ausführen und die Internetverbindung wiederherstellen.
BlackJack

@Nr8: Zum Ausführen von externen Programmen gibt es das `subprocess`-Modul in der Standardbibliothek.
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

danke! hat geklappt
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Also wenn ich den try: except über der while-Schleife schreibe geht es gut aber in der while-Schleife gibt er mir einen Fehler aus.

Code:

Code: Alles auswählen

#!/usr/bin/python
import urllib2
import urllib
import time
from datetime import datetime
import subprocess
import sys
import os

LON = 0
LAT = 0
# Geschwindigkeit messen
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=3, buf=10):
       # try:
                f = urllib.urlopen(url)
        #except IOError:
       #         subprocess.call(["./Verbindungsaufbau"])
#        exit(0)
 #               print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
  #      except IndexError:
   #             print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
    #            exit(0)
     #   else:   
                tStart = datetime.now()
                amount = 0
                x = 0
    while ((len(f.read(buf))==buf) and (x<= 6)):
                try:
                        f = urllib.urlopen(url)
                except IOError:
                        subprocess.call(["./Verbindungsaufbau"])
                        exit(0)
                        print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
                else:
                        tEnd = datetime.now()
                        dif = (tEnd - tStart).total_seconds()
                        LAT=sys.argv[1]
                        LON=sys.argv[2]
                        if (dif >= intervall):
                                print (time.strftime("%H:%M:%S; ")),((((amount/intervall)/1000.00)*8)/1024), "Mbit/s;", LAT ,";" , LON
                                amount = 0
                                tStart = datetime.now()
                                x = x + 1       
    
                        else:
                                amount = amount + buf

try:
    measure(buf=1000, intervall=3)
except  KeyboardInterrupt:
    exit(0)
Zuletzt geändert von Anonymous am Donnerstag 22. Dezember 2016, 09:37, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

solange du dein Programm hier ohne korrekte Einrückungen postest, kann man eher wenig sagen. Den Code bitte in einen Codeblock setzen, dann werden auch die Einrückungen übernommen.

Außerdem ist es hilfreich, wenn du die _komplette_ Fehlermeldung postest. "Geht nicht" ist wenig hilfreich...

Gruß, noisefloor
Nr8
User
Beiträge: 42
Registriert: Mittwoch 21. Dezember 2016, 08:43

Oh Entschuldigung.

Fehler:

[codebox=text file=Unbenannt.txt] File "./Spee.py", line 32
while ((len(f.read(buf))==buf) and (x<= 6)):
^
IndentationError: unindent does not match any outer indentation level
[/code]

Code: Alles auswählen

#!/usr/bin/python
import urllib2
import urllib
import time
from datetime import datetime
import subprocess
import sys
import os

LON = 0
LAT = 0
# Geschwindigkeit messen
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=3, buf=10):
       # try:
                f = urllib.urlopen(url)
        #except IOError:
       #         subprocess.call(["./Verbindungsaufbau"])
#        exit(0)
 #               print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
  #      except IndexError:
   #             print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
    #            exit(0)
     #   else:   
                tStart = datetime.now()
                amount = 0
                x = 0
    while ((len(f.read(buf))==buf) and (x<= 6)):
               # LON = 0
                #LAT = 0
                try:
                        f = urllib.urlopen(url)
                except IOError:
                        subprocess.call(["./Verbindungsaufbau"])
                        exit(0)
                        print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
                else:
                        tEnd = datetime.now()
                        dif = (tEnd - tStart).total_seconds()
                        LAT=sys.argv[1]
                        LON=sys.argv[2]
                        if (dif >= intervall):
                                print (time.strftime("%H:%M:%S; ")),((((amount/intervall)/1000.00)*8)/1024), "Mbit/s;", LAT ,";" , LON
                                amount = 0
                                tStart = datetime.now()
                                x = x + 1       
    
                        else:
                                amount = amount + buf

try:
    measure(buf=1000, intervall=3)
except  KeyboardInterrupt:
    exit(0)
Zuletzt geändert von Anonymous am Donnerstag 22. Dezember 2016, 09:39, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@Nr8: der Fehler ist doch eindeutig. Einrückungen sind in Python syntaktisch relevant. Du solltest **immer** mit 4 Leerzeichen pro Ebene einrücken und Dir einen Editor suchen, der Blockkommentare beherrscht. Innerhalb der while-Schleife solltest Du nicht versuchen eine neue Verbindung aufzubauen. Das macht keinen Sinn. Und `exit` gehört in keine Funktion. Großgeschriebene Variablennamen sind per Konvention Konstanten, LAT und LON werden aber verändert, und dann noch mit sys.argv, was an dieser Stelle auch überraschend ist. Überraschungen mögen Programmierer nicht. while und if brauchen keine Klammern um die Bedingung. Also weg damit.
BlackJack

@Nr8: Die Meldung sagt es doch eigentlich sehr deutlich, die Einrückungstiefe von der ``while``-Schleife passt nicht zu der äusseren Einrückungstiefe. Das ist weder so weit eingerückt wie die Zeilen die zu der Funktion gehören, noch so weit eingerückt wie die Zeilen die nicht mehr zu der Funktion gehören. Und da der Compiler anhand der Einrückungstiefe abliest zu welchem Block Codezeilen gehören sollen, weiss er nicht was er damit anfangen soll.

Einrückungstiefe ist per Konvention übrigens vier Leerzeichen pro Ebene.

Wenn ich mir die Zeilen 18 bis 23 anschaue solltest Du entweder die Funktionen Deines Editors besser kennenlernen oder einen anderen Editor verwenden, denn jeder gute Texteditor bietet die Möglichkeit einen markierten Zeilenblock komplett ein- oder auszukommentieren. Das dürfte schneller und weniger fehleanfällig gehen als das manuell für jede Zeile zu machen.

Kein einziger `exit()`-Aufruf in dem Programm ist wirklich nötig, auch die im auskommentierten Code nicht. Mit dieser Funktion sollte man sehr sparsam umgehen weil das eine recht drastische Vorgehensweise ist, die es schwierig machen kann Veränderungen vorzunehmen, wenn man beispielsweise ein Programm doch nicht beenden möchte, oder eine Funktion verwenden möchte ohne das in bestimmten Fällen gleich das gesamte Programm beendet wird.

Zudem muss das eigentlich ``sys.exit()`` heissen, denn offiziell gibt es die `exit()`-Funktion so gar nicht.

Bei den Bedingungen bei ``while`` und ``if`` sind sämtliche Klammern überflüssig.

`LAT` und `LON` sind wie Konstanten geschrieben, sind aber keine Konstanten. Das die in der `measure()`-Funktion aus den Kommandozeilenargumenten geholt werden, ist ein wenig undurchsichtig.

Und noch mal inhaltlich zum Programm: Der Ablauf macht *so* wenig bis gar keinen Sinn. Ich persönlich würde auch die Zeitmessung und die Ausgabe voneinander trennen.
Antworten