Die Internet -Verbindung von Python
CPython unter Windows
CPython unter Windows übernimmt die Einstellungen des Betriebssystems (wie beispielsweise den Proxy), kann aber durch folgende Umgebungsvariablen¹ beeinflußt werden.
- Umgebungsvariablen
- HTTP_PROXY Proxy für HTTP
- HTTPS_PROXY Proxy für HTTPS
- NO_PROXY Domains[:port] ohne Proxy, kommagetrennt, »*«= „alle Domains ohne Proxy“
Von Python aus können Umgebungsvariablen mit »__import__( 'os' ).environ[ name ] = wert « eingestellt werden, von Windows aus mit »SET name = wert « (Löschen: »SET name =«).
Ursachen für bestehende Verbindungsprobleme können auch Einstellungen von Brandmauern sein.
¹ siehe auch: Dokumentation von »urllib.request.urlopen« und »urllib.request.ProxyHandler«.
- Beispiele
__import__( 'os' ).environ[ 'NO_PROXY' ] = '*'
Benutzung von Sockets
- Beispiel (unvollständig)
import socket as sockets
socket = sockets.socket( sockets.AF_INET, ...
socket.connect( ( 'news.albasani.net', 119 ...
print( 'connected' )
socket.send( b'Hello\r\n' )
print( 'sent' )
reply = socket.recv( 100 )
print( 'reply:', str( reply ))
socket.close()
Zur Vorgehensweise beim Empfangen von Daten mit sockets
Mit "recv" werden maximal so viele Bytes gelesen, wie beim Aufruf durch den Argumentwert angegeben wird.
Ein Aufruf von "recv" kann aber auch weniger Daten liefern, so daß es nötig werden kann, "recv" erneut aufzurufen, um eine bestimmte Nachrichte vollständig zu erhalten. Längere Nachrichten können so durch eine Folge mehrerer "recv"-Aufrufe erhalten werden, deren Ergebnisse dann zusammenzusetzen sind, um die gesamte Nachricht zu erhalten.
Wenn bekannt ist, daß die erwartete Nachricht eine bestimmte Länge hat, dann kann "recv" solange aufgerufen werden, bis entsprechend viele Bytes eingelesen wurden. Bytes, die darüber hinaus noch erhalten wurden, gehören schon zur nächsten Nachricht und sollten daher für diese nächste Nachricht aufbewahrt werden.
Eine Nachricht wird also im allgemeinen in einer "recv"-Schleife empfangen.
Dabei sind noch die folgenden Situationen möglich:
- Wenn die maximale Dauer zum Warten auf Bytes überschritten wurde (“timeout exception ”), könnte es sein, daß die Gegenstelle zu langsam geworden ist.
- Wenn eine leere Folge von Bytes geliefert wird, wurde die Verbindung unterbrochen.
Neben Nachrichten fester Länge werden auch Nachrichten mit einer Endmarkierung verwendet. Um eine solche Nachricht zu empfangen, fügt man die Ergebnisse aller bisherigen "recv"-Aufrufe hintereinander bis man darin die Endmarkierung findet. Damit ist die aktuelle Nachricht empfangen. Eventuelle Bytes, die nach der Endmarkierung noch gelesen wurden, sollten wieder als Anfang der nächsten Nachricht aufbewahrt beziehungsweise verwendet werden.