Python 3 - Netzwerkprogrammierung
Python bietet zwei Zugriffsebenen auf die Netzwerkdienste. Auf niedriger Ebene können Sie auf die grundlegende Socket-Unterstützung des zugrunde liegenden Betriebssystems zugreifen, mit der Sie Clients und Server sowohl für verbindungsorientierte als auch für verbindungslose Protokolle implementieren können.
Python verfügt auch über Bibliotheken, die übergeordneten Zugriff auf bestimmte Netzwerkprotokolle auf Anwendungsebene wie FTP, HTTP usw. bieten.
Dieses Kapitel gibt Ihnen einen Einblick in das bekannteste Konzept in Networking - Socket Programming.
Was sind Steckdosen?
Sockets sind die Endpunkte eines bidirektionalen Kommunikationskanals. Sockets können innerhalb eines Prozesses, zwischen Prozessen auf demselben Computer oder zwischen Prozessen auf verschiedenen Kontinenten kommunizieren.
Sockets können über verschiedene Kanaltypen implementiert werden: Unix-Domain-Sockets, TCP, UDP usw. Die Socket- Bibliothek bietet spezifische Klassen für die Abwicklung der allgemeinen Transporte sowie eine generische Schnittstelle für die Abwicklung des Restes.
Steckdosen haben ihren eigenen Wortschatz -
Sr.Nr. | Begriff & Beschreibung |
---|---|
1 | domain Die Protokollfamilie, die als Transportmechanismus verwendet wird. Diese Werte sind Konstanten wie AF_INET, PF_INET, PF_UNIX, PF_X25 usw. |
2 | type Die Art der Kommunikation zwischen den beiden Endpunkten, normalerweise SOCK_STREAM für verbindungsorientierte Protokolle und SOCK_DGRAM für verbindungslose Protokolle. |
3 | protocol Typischerweise Null, kann dies verwendet werden, um eine Variante eines Protokolls innerhalb einer Domäne und eines Typs zu identifizieren. |
4 | hostname Die Kennung einer Netzwerkschnittstelle -
|
5 | port Jeder Server wartet auf Clients, die einen oder mehrere Ports anrufen. Ein Port kann eine Fixnum-Portnummer, eine Zeichenfolge mit einer Portnummer oder der Name eines Dienstes sein. |
Das Sockelmodul
Um einen Socket zu erstellen, müssen Sie die Funktion socket.socket () verwenden, die im Socket-Modul verfügbar ist und die allgemeine Syntax hat:
s = socket.socket (socket_family, socket_type, protocol = 0)
Hier ist die Beschreibung der Parameter -
socket_family - Dies ist entweder AF_UNIX oder AF_INET, wie zuvor erläutert.
socket_type - Dies ist entweder SOCK_STREAM oder SOCK_DGRAM.
protocol - Dies wird normalerweise weggelassen und ist standardmäßig 0.
Sobald Sie ein Socket- Objekt haben, können Sie die erforderlichen Funktionen verwenden, um Ihr Client- oder Serverprogramm zu erstellen. Es folgt die Liste der erforderlichen Funktionen -
Server-Socket-Methoden
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | s.bind() Diese Methode bindet die Adresse (Hostname, Portnummernpaar) an den Socket. |
2 | s.listen() Diese Methode richtet den TCP-Listener ein und startet ihn. |
3 | s.accept() Diese akzeptieren passiv die TCP-Client-Verbindung und warten, bis die Verbindung eintrifft (Blockierung). |
Client-Socket-Methoden
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | s.connect() Diese Methode initiiert aktiv die TCP-Serververbindung. |
Allgemeine Socket-Methoden
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | s.recv() Diese Methode empfängt eine TCP-Nachricht |
2 | s.send() Diese Methode überträgt eine TCP-Nachricht |
3 | s.recvfrom() Diese Methode empfängt eine UDP-Nachricht |
4 | s.sendto() Diese Methode überträgt UDP-Nachrichten |
5 | s.close() Diese Methode schließt den Socket |
6 | socket.gethostname() Gibt den Hostnamen zurück. |
Ein einfacher Server
Zum Schreiben von Internet-Servern verwenden wir die socketFunktion im Socket-Modul verfügbar, um ein Socket-Objekt zu erstellen. Ein Socket-Objekt wird dann verwendet, um andere Funktionen zum Einrichten eines Socket-Servers aufzurufen.
Rufen Sie jetzt die bind(hostname, port)Funktion zum Angeben eines Ports für Ihren Dienst auf dem angegebenen Host.
Rufen Sie als Nächstes die Methode accept des zurückgegebenen Objekts auf. Diese Methode wartet, bis ein Client eine Verbindung zu dem von Ihnen angegebenen Port herstellt, und gibt dann ein Verbindungsobjekt zurück , das die Verbindung zu diesem Client darstellt.
#!/usr/bin/python3 # This is server.py file
import socket
# create a socket object
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 9999
# bind to the port
serversocket.bind((host, port))
# queue up to 5 requests
serversocket.listen(5)
while True:
# establish a connection
clientsocket,addr = serversocket.accept()
print("Got a connection from %s" % str(addr))
msg = 'Thank you for connecting'+ "\r\n"
clientsocket.send(msg.encode('ascii'))
clientsocket.close()
Ein einfacher Client
Schreiben wir ein sehr einfaches Client-Programm, das eine Verbindung zu einem bestimmten Port 12345 und einem bestimmten Host herstellt. Es ist sehr einfach, einen Socket-Client mit der Socket- Modul-Funktion von Python zu erstellen .
Das socket.connect(hosname, port )Öffnet eine TCP-Verbindung zum Hostnamen am Port . Sobald Sie einen Socket geöffnet haben, können Sie wie jedes E / A-Objekt daraus lesen. Wenn Sie fertig sind, denken Sie daran, es zu schließen, als würden Sie eine Datei schließen.
Beispiel
Der folgende Code ist ein sehr einfacher Client, der eine Verbindung zu einem bestimmten Host und Port herstellt, alle verfügbaren Daten vom Socket liest und dann beendet -
#!/usr/bin/python3 # This is client.py file
import socket
# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# get local machine name
host = socket.gethostname()
port = 9999
# connection to hostname on the port.
s.connect((host, port))
# Receive no more than 1024 bytes
msg = s.recv(1024)
s.close()
print (msg.decode('ascii'))
Führen Sie nun diese server.py im Hintergrund aus und führen Sie dann die obige client.py aus, um das Ergebnis anzuzeigen.
# Following would start a server in background.
$ python server.py &
# Once server is started run client as follows:
$ python client.py
Ausgabe
Dies würde folgendes Ergebnis liefern -
on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
Thank you for connecting
Python-Internetmodule
Eine Liste einiger wichtiger Module in der Python-Netzwerk- / Internet-Programmierung finden Sie unten -
Protokoll | Gemeinsame Funktion | Port Nr | Python-Modul |
---|---|---|---|
HTTP | Webseiten | 80 | httplib, urllib, xmlrpclib |
NNTP | Usenet-Nachrichten | 119 | nntplib |
FTP | Dateiübertragungen | 20 | ftplib, urllib |
SMTP | Email schicken | 25 | smtplib |
POP3 | E-Mail abrufen | 110 | Poplib |
IMAP4 | E-Mail abrufen | 143 | imaplib |
Telnet | Befehlszeilen | 23 | Telnetlib |
Gopher | Dokumentübertragungen | 70 | Gopherlib, Urllib |
Bitte überprüfen Sie alle oben genannten Bibliotheken, um mit den Protokollen FTP, SMTP, POP und IMAP zu arbeiten.
Weitere Lesungen
Dies war ein schneller Einstieg in die Socket-Programmierung. Es ist ein großes Thema. Es wird empfohlen, über den folgenden Link weitere Details zu erfahren:
Unix-Socket-Programmierung .
Python Socket Library und Module .