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 -

  • Eine Zeichenfolge, die ein Hostname, eine gepunktete Quad-Adresse oder eine IPV6-Adresse in Doppelpunkt- (und möglicherweise Punkt-) Schreibweise sein kann

  • Eine Zeichenfolge "<broadcast>", die eine INADDR_BROADCAST-Adresse angibt.

  • Eine Zeichenfolge mit der Länge Null, die INADDR_ANY oder angibt

  • Eine Ganzzahl, die als Binäradresse in der Reihenfolge der Hostbytes interpretiert wird.

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 .