Kommunikation in Python steuern Netzwerkanbindung in Python-Apps programmieren

Von Thomas Joos

Soll ein Python-Programm mit dem Netzwerk kommunizieren, kommen Protokolle wie TCP/UDP, HTTP oder SMTP zum Einsatz. Mit dem Socket-Modul in Python lassen sich diese Protokolle im eigenen Code nutzen.

Das Socket-Modul von Pythons erlaubt es, mithilfe der lokalen Daten die Netzwerk-Kommunikation zu realisieren.
Das Socket-Modul von Pythons erlaubt es, mithilfe der lokalen Daten die Netzwerk-Kommunikation zu realisieren.
(Bild: Joos / Python.org)

Das wichtigste Modul in Python, das für die Kommunikation des jeweiligen Programmcodes mit dem Netzwerk verantwortlich ist, stellt das Modul „socket“ dar. Das Modul stellt die Verbindung zwischen dem Python-Programm und dem Betriebssystem dar, auf dem das Programm läuft. Mit dem Modul „socketserver“ ist es wiederum möglich, Client-/Server-Programme mit Python zu betreiben, bei denen ein Serverpart auch mehrere Netzwerkverbindungen parallel aufbauen kann.

Das Socket-Modul in Python verstehen

Geht eine Netzwerkkommunikation ein, die für das jeweilige Programm gedacht ist, läuft das über einen Socket. Mit diesem Socket kommunizieren Programme zwischen verschiedenen Computern im Netzwerk zusammen, zum Beispiel Clients und Server.

Quell- und Ziel-Sockets können sich auf verschiedenen Rechnern, in verschiedenen Netzwerken oder auch im Internet verbinden. Wichtig ist nur, dass es eine physische Verbindung gibt, zwischen denen Programme über die Sockets kommunizieren können. Die Sockets kommen nicht nur bei Python zum Einsatz, sondern auch in anderen Programmiersprachen.

Bei der Programmierung einer Client-/Server-Anwendung mit Python kommt auf dem Server ein Verbindungssocket zum Einsatz. Dieses wartet auf Verbindungen der Clients. Zum Einsatz kommen die Methoden „bind“ und „list“. Mit diesen Methoden wartet ein Python-Programm auf eingehende Anfragen im Netzwerk. Gehen Verbindungen ein, überprüft das Python-Programm, ob diese berechtigt sind, und baut eine Verbindung mit dem Socket des Clients auf.

Für einen Socket lassen sich verschiedene Methoden nutzen, um die Verbindung zwischen Client und Server aufzubauen und zu kommunizieren. Dazu kommen normalerweise folgende Methoden zum Einsatz:

  • s.bind() – Diese Methode bindet die Adresse, den Namen und den Port an den Socket
  • s.list() – Diese Methode wartet auf Verbindungen und startet normalerweise einen TCP-Listener
  • s.accept() – Diese Methode akzeptiert eingehende Verbindungen von Clients.

Kommunikations-Sockets für Clients

Dazu wird ein Kommunikation-Socket aufgebaut, über den der jeweilige Client und Server miteinander kommunizieren. Der Client nutzt für den Aufbau die Methode „connect“. Zur Kommunikation dienen Methoden wie „send“ und „recv“. Natürlich kann ein Server auch mehrere Kommunikations-Sockets aufbauen, da in den meisten Fällen nicht nur ein Client mit dem Server kommuniziert.

Standardmäßig kommen für die Kommunikation zunächst TCP und UDP zum Einsatz. In den meisten Fällen verwenden Programme das TCP-Protokoll. Der Aufbau eines Socket erfolgt durch die Funktion „socket ()“ mit folgender Syntax:

socket.socket([family[, type[, proto]]])

Die erwähnten Methonden „send“ und „recv“ dienen Clients dazu, Daten an den Server zu senden oder generell auf Servern und Clients, um über das Netzwerk zu kommunizieren. Hier spielen folgende Methoden eine Rolle:

  • s.connect() – Diese Methode initiiert aktiv eine TCP-Serververbindung vom Client auf dem Server.
  • s.recv() – Die Methode kommt auf Servern und Clients zum Einsatz, um TCP-Pakete zu erhalten.
  • s.send() – Die Methode hat auf dem Client und dem Server die Aufgabe TCP-Pakete zu senden.

Soll auch das verbindungslose UDP-Protokoll zum Einsatz kommen, werden die Methoden „s.recvfrom()“ und „s.sendto()“ genutzt. Um nach der Kommunikation einen Socket wieder freizugeben, wird dieser geschlossen. Dazu kommt die Methode „s.close()“ zum Einsatz.

Beispiel-Funktionen für die Netzwerkkommunikation mit Python

Der folgende Code beispielsweise öffnet auf dem Server einen Socket:

import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8080))
serversocket.listen(10)

Mit dem Socket-Modul lassen sich die Daten des lokalen Computers nutzen, um eine Netzwerkkommunikation aufzubauen.
Mit dem Socket-Modul lassen sich die Daten des lokalen Computers nutzen, um eine Netzwerkkommunikation aufzubauen.
(Bild: Joos / Python.org)

Name oder IP-Adresse des aktuellen Computers lassen sich mit „socket.gethostname()“ in Python abfragen. Dabei gibt die Funktion „gethostname()“ zunächst den Namen des Computers aus. Soll auch die IP-Adresse ausgelesen und angezeigt werden, kommt folgende Zeile zum Einsatz:

print(socket.gethostbyname(socket.gethostname()))

Ist der Computer auch mit dem Internet verbunden, kann auch die Funktion „socket.getsockname()“ zum Einsatz kommen, um die lokale IP-Adresse des Python-Rechners zu nutzen, zum Beispiel:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
print(s.getsockname()[0])

Nutzen der Funktion socket.getsockname() für die Kommunikation von Python-Programmen mit dem Internet.
Nutzen der Funktion socket.getsockname() für die Kommunikation von Python-Programmen mit dem Internet.
(Bild: Joos / Python.org)

Beim Öffnen eines Socket wird auch der Transportmechanismus festgelegt. Dabei kann es sich um Konstanten wie „AF_INET“, „PF_INET“, „PF_UNIX“ oder „PF_X25“ handeln. Auch die Art der Kommunikation wird an dieser Stelle angegeben, zum Beispiel „SOCK_STREAM“ für verbindungsorientierte Protokolle und „SOCK_DGRAM“ für verbindungslose Protokolle.

Zu guter Letzt lässt sich auch das Protokoll an dieser Stelle definieren, um eine Variante eines Protokolls innerhalb eines Bereichs und Typs zu identifizieren. Beim Öffnen eines Sockets ist der Identifier und unter Umständen auch der Port für den Aufbau des Sockets notwendig.

Um die Sockets für die Kommunikation mit dem http-Protokoll zu nutzen, kommen zum Beispiel die Module „httplib“, „urllib“ oder „xmlrpclib“ zum Einsatz. Zum Versenden von E-Mails aus Python-Programmen heraus kann das SMTP-Protokoll zum Einsatz kommen. Dieses lässts ich in Python mit dem Modul „smtplib“ nutzen.

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung

Server vor dem Verbindungsaufbau anpingen

Vor dem Verbindungsaufbau mit einem Server, kann vom Client aus auch ein Ping in Python über ICMP genutzt werden, mit dem der erfolgreiche Verbindungsaufbau getestet werden kann. Dazu kann zum Beispiel das Modul „ping3“ zum Einsatz kommen. Installiert wird dieses zum Beispiel mit:

pip install ping3

Nach der Installation des Moduls kann die Methode ping() zum Einsatz kommen:

from ping3 import ping
def myping(host):
  resp = ping(host)
  if resp == False:
    return False
  else:
    return True
    print(myping("www.google.com"))

Weitere Möglichkeiten sind in der Python-Dokumentation unter „socket – Low-level networking interface“ und „socketserver – A framework for network servers“ zu finden.

(ID:48201216)