Python Netzwerkprogrammierung: Sockets & erweiterte Protokolle meistern
Zugangsebenen zu Netzwerkdiensten
Python bietet zwei Ebenen für den Zugriff auf Netzwerkdienste:
- Niedrige Ebene: Zugriff auf die grundlegende Socket-Unterstützung des Betriebssystems. Ermöglicht Implementierung von Clients und Servern für verbindungsorientierte und verbindungslose Protokolle.
- Hohe Ebene: Bibliotheken für spezifische Anwendungsprotokolle wie FTP, HTTP etc.
Dieses Kapitel vermittelt Verständnis für das bekannteste Networking-Konzept: Socket Programming.
Was sind Sockets?
Sockets sind die Endpunkte eines bidirektionalen Kommunikationskanals. Sie können innerhalb eines Prozesses, zwischen Prozessen auf demselben Rechner oder zwischen Prozessen auf verschiedenen Kontinenten kommunizieren.
Sockets können über verschiedene Kanaltypen implementiert werden: Unix Domain Sockets, TCP, UDP etc. Die socket-Bibliothek stellt spezifische Klassen für gängige Transports sowie ein generisches Interface für den Rest bereit.
Socket-Vokabular
| Nr. | Begriff & Beschreibung |
|---|---|
| 1 | Domain – Protokollfamilie als Transportmechanismus. Konstanten wie AF_INET, PF_INET, PF_UNIX, PF_X25 etc. |
| 2 | type – Kommunikationsart zwischen Endpunkten. Typisch SOCK_STREAM (verbindungsorientiert) und SOCK_DGRAM (verbindungslos). |
| 3 | protocol – Meist 0, kann Variante eines Protokolls innerhalb von Domain und Type identifizieren. |
| 4 | hostname – Netzwerkschnittstellen-Identifier:
|
| 5 | port – Server lauscht auf einem oder mehreren Ports. Port kann Fixnum, String mit Portnummer oder Servicename sein. |
Das socket-Modul
Zum Erstellen eines Sockets verwenden Sie socket.socket() aus dem socket-Modul:
s = socket.socket(socket_family, socket_type, protocol=0)
Parameter
- socket_family –
AF_UNIXoderAF_INET. - socket_type –
SOCK_STREAModerSOCK_DGRAM. - protocol – Meist weggelassen, Default 0.
Mit dem Socket-Objekt können Sie Client- oder Serverprogramme erstellen. Erforderliche Funktionen:
Server-Socket-Methoden
| Nr. | Methode & Beschreibung |
|---|---|
| 1 | s.bind() – Bindet Adresse (Hostname, Port) an Socket. |
| 2 | s.listen() – Richtet TCP-Listener ein und startet ihn. |
| 3 | s.accept() – Akzeptiert passiv TCP-Clientverbindung, blockiert bis Verbindung eintrifft. |
Client-Socket-Methoden
| Nr. | Methode & Beschreibung |
|---|---|
| 1 | s.connect() – Initiiert aktiv TCP-Serververbindung. |
Allgemeine Socket-Methoden
| Nr. | Methode & Beschreibung |
|---|---|
| 1 | s.recv() – Empfängt TCP-Nachricht. |
| 2 | s.send() – Sendet TCP-Nachricht. |
| 3 | s.recvfrom() – Empfängt UDP-Nachricht. |
| 4 | s.sendto() – Sendet UDP-Nachricht. |
| 5 | s.close() – Schließt Socket. |
| 6 | socket.gethostname() – Gibt Hostname zurück. |
Ein einfacher Server
Für Internet-Server nutzen wir socket() aus dem socket-Modul zum Erstellen eines Socket-Objekts. Dieses ruft weitere Funktionen zum Einrichten des Servers auf.
Rufen Sie bind(hostname, port) auf, um einen Port für Ihren Dienst am gegebenen Host festzulegen. Dann rufen Sie accept() des zurückgegebenen Objekts auf. Diese Methode wartet, bis ein Client sich mit dem angegebenen Port verbindet, und gibt ein connection-Objekt zurück, das die Verbindung zu diesem Client repräsentiert.
#!/usr/bin/python
# server.py
import socket
s = socket.socket()
host = socket.gethostname()
port = 12345
s.bind((host, port))
s.listen(5)
while True:
c, addr = s.accept()
print('Got connection from', addr)
c.send('Thank you for connecting')
c.close()
Ein einfacher Client
Ein einfaches Client-Programm, das eine Verbindung zu Port 12345 und gegebenem Host öffnet:
#!/usr/bin/python # client.py import socket s = socket.socket() host = socket.gethostname() port = 12345 s.connect((host, port)) print(s.recv(1024)) s.close()
Führen Sie server.py im Hintergrund aus, dann client.py:
$ python server.py & $ python client.py
Ergebnis:
Got connection from ('127.0.0.1', 48437)
Thank you for connecting
Python Internet-Module
Wichtige Module für Python Network/Internet Programming:
| Protokoll | Funktion | Port | Python-Modul |
|---|---|---|---|
| HTTP | Webseiten | 80 | httplib, urllib, xmlrpclib |
| NNTP | Usenet News | 119 | nntplib |
| FTP | Dateiübertragung | 20 | ftplib, urllib |
| SMTP | E-Mail senden | 25 | smtplib |
| POP3 | E-Mail abrufen | 110 | poplib |
| IMAP4 | E-Mail abrufen | 143 | imaplib |
| Telnet | Kommandozeilen | 23 | telnetlib |
| Gopher | Dokumentübertragung | 70 | gopherlib, urllib |
Prüfen Sie die genannten Bibliotheken für Arbeit mit FTP, SMTP, POP und IMAP.
Weiterführende Literatur
Dies war ein schneller Einstieg in Socket Programming. Es ist ein umfangreiches Thema. Empfohlene Links für Details:
- Unix Socket Programming.
- Python Socket Library and Modules.
Python
- Python-Datentypen meistern: Praxisleitfaden
- Python-Operatoren meistern: Umfassender Leitfaden
- Python pass-Statement meistern: Praxisleitfaden
- Python-Funktionsargumente meistern: Positional, Keyword & Default-Parameter
- Python-Dictionaries meistern: Erstellung, Manipulation und fortgeschrittene Techniken
- Python Objektorientierte Programmierung meistern: Klassen, Vererbung, Kapselung & Polymorphie
- Python Iteratoren meistern: Funktionsweise und Erstellung eigener Iteratoren
- Python Closures erklärt: Wie verschachtelte Funktionen Variablen erfassen
- Python datetime meistern: Praktischer Leitfaden zu Datumsangaben, Zeiten und Zeitzonen
- Pythons time.sleep() meistern: Best Practices, Multithreading und Praxisbeispiele