Benutzer-Werkzeuge

Webseiten-Werkzeuge


python:sockets

Clientverbindung

  • Sind 2-Wege-Verbindungen (es kann sowohl empfangen, als auch gesendet werden

Folgende Methodenaufrufe sind notwendig (es können aber je nach Szenario mehr werden):

  • import socket
  • soc = socket.socket(Typ, Protokoll) - Erstellt einen Socket und speichert ihn als soc
    • Typ ist für IP-Verbindungen socket.AF_INET
    • Protokoll ist das zu verwendende Übetragunsprotokoll (TCP, UDP im Falle von IP)
      • socket.SOCK_STREAM (TCP)
      • socket.SOCK_DGRAM (UDP)
  • soc.connect((host, port))

    - Verbindet sich mit einem Remote-Host, Host und Port müssen als Tuppel übergeben werden

  • soc.close - Beendet die Verbindung

Senden und empfangen von Daten

  • es gibt 2 grundsätzliche Wege
    • per recv und send
    • in dem man sich einen Filedescriptor geben lässt

Rev/send

variable = soc.recv(1024)

Es werden 1024 aus dem eingehenden Netzwerkpuffer ausgelesen und in Variable gespeichert.
Sind keine 1024 Byte vorhanden, wird gewartet bis 1024 Byte vorhanden sind oder die Verbindung durch die Gegenseite beendet wurde.

send_byte = soc.send(Daten)

Schreibt Daten in den Netzwerkpuffer.
Achtung: Ist der Netzwerkpuffer bereits angefüllt oder die Datenmenge zu groß für den Netzwerkpuffer werden nur so viele Daten wie in den freien Puffer passen geschrieben. Sobald dieser voll ist gibt die Methode die Menge der angegebenen Daten zurück. Es kann also sein, dass für den Rest der noch nicht geschriebenen Daten noch mal send(Daten) aufgerufen werden muss.

Alternativ kann man sendall() benutzen:

soc.sendall(Daten)

Das ruft send() so oft auf, bis alle Daten gesendet wurden. Es blockiert aber auch so lange bis alle Daten gesendet wurden.

File-Methode

  • Es wird ein Filehandler zur Verfügung gestellt
  • man schreibt dann einfach in eine „Datei“
  • Achtung: Die Daten werden nicht unbedingt sofort (komplett) gesendet wenn man sie schreibt. Vor dem schließen der Verbindung sollte man unbedingt „flush()“ aufrufen, was das senden aller Daten erzwingt.
filehandle = soc.makefile(Mode, encoding)
  • Mode → „r“ → Lesen, „w“ → Schreiben, „b“ → Binärdaten (ansonsten wird ein String erwartet)
  • encoding → Encoding für die übertragenen Daten (z.B. UTF-8)
filehandle.write(Daten)

Oben stehender Code schreibt die Daten in die „Datei“ (auf das Netzwerk).
Achtung: Die Daten werden ggf. nicht oder nicht alle sofort gesendet. Wird die Verbindung geschlossen (egal von welcher Seite) bevor alle Daten gesendet wurden, werden diese einfach nicht gesendet. Also auch ein soc.close vom sendenden System führt nicht dazu, dass alle Daten zuvor gesendet werden! Um sicher zu stellen, dass alle Daten vor dem Schließen auf die andere Seite gesendet wurden, muss man filehandle.flush() aufrufen.


Gelesen werden können die Daten per read oder per loop:

filehandle.read()

Wobei obiger Aufruf erst zurückkommt wenn die Verbindung durch die Gegenseite abgebaut wird.
Normalerweise würde read() bis zum Ende der Datei lesen, in diesem Fall hat die Datei aber kein Ende, also wird ein künstliches Dateiende mit dem Ende der Übertragung gesetzt - natürlich kann man auch wie bei „richtigen“ Dateien read ein Limit übergeben, dann kommt es zurück, sobald entweder die angegebene Menge Byte empfangen wurden oder die Übertragung beendet wurde.

for line in filehandle:
   somecode

Die Schleife ließt die Daten Zeilenweise aus der Datei (wenn in den Daten Zeilenumbrüche enthalten sind). Sie wird so lange laufen, bis die Verbindung beendet ist (dann ist das Ende der Datei erreicht).

Serverseite

  • Der eigentliche Serversocket nimmt nur die eingehenden Verbindungen an
  • und gibt einen Clientsocket pro eingehender Verbindung zurück, über den dann Daten gesendet und empfangen werden können
  • import socket
  • soc = socket.socket(Typ, Protokoll) - Erstellt einen Socket und speichert ihn als soc
    • Typ ist für IP-Verbindungen socket.AF_INET
    • Protokoll ist das zu verwendende Übetragunsprotokoll (TCP, UDP im Falle von IP)
      • socket.SOCK_STREAM (TCP)
      • socket.SOCK_DGRAM (UDP)
  • soc.bind((IP, port))

    - Bindet den Socket an eine bestimmte IP des Systems und an einen bestimmten Port (muss als tuple angegeben werden)

  • soc.listen(Anzahl Verbindungen) - Versetzt den Socket in den listen-Modus. Die Angabe der Anzahl Verbindungen definiert wie viel Verbindungen maximal angenommen werden → die Methode kehrt allerdings nach jeder eingehenden Verbindung zurück (nur der Socket akeztiert maximal so viele)
  • (clientsocket, address) = sock.accept() - Der Socket lauscht jetzt auf eingehende Verbindungen. Jede neu eingehende Verbindung wird in der Variable clientsocket gespecheichert, die Addresse in address.
  • der in clientsocket gespeicherte Socket kann wie unter Clientverbindung beschrieben genutzt werden
python/sockets.txt · Zuletzt geändert: 2019/03/24 19:55 von root