Python3-Netzwerkprogrammierung
Python bietet Netzwerkdienste auf zwei Ebenen:
- Low-Level-Netzwerkdienste unterstützen grundlegende Sockets und bieten die standardmäßige BSD-Sockets-API, die auf alle Methoden der Socket-Schnittstelle des zugrunde liegenden Betriebssystems zugreifen kann.
- Das High-Level-Netzwerkdienstmodul SocketServer bietet serverzentrierte Klassen, die die Entwicklung von Netzwerkservern vereinfachen können.
Was ist ein Socket?
Socket, auch als "Socket" bekannt, wird von Anwendungen verwendet, um Anfragen an das Netzwerk zu senden oder auf Netzwerkanfragen zu antworten, wodurch die Kommunikation zwischen Hosts oder zwischen Prozessen auf demselben Computer ermöglicht wird.
socket()-Funktion
In Python verwenden wir die Funktion socket(), um einen Socket zu erstellen, und die Syntax lautet wie folgt:
socket.socket([family[, type[, proto]]])
Parameters
- family: Die Socket-Familie kann AF_UNIX oder AF_INET sein
- type: Der Socket-Typ kann danach unterschieden werden, ob er verbindungsorientiert oder verbindungslos ist:
SOCK_STREAModerSOCK_DGRAM - proto: Wird im Allgemeinen leer gelassen, Standardwert ist 0.
Socket-Objekt-Methoden (integriert)
| Funktion | Beschreibung |
|---|---|
| Serverseitiger Socket | |
| s.bind() | Bindet die Adresse (host, port) an den Socket. Unter AF_INET wird die Adresse in Form eines Tupels (host, port) dargestellt. |
| s.listen() | Startet das TCP-Listening. backlog gibt die maximale Anzahl an Verbindungen an, die das Betriebssystem in die Warteschlange stellen kann, bevor Verbindungen abgelehnt werden. Dieser Wert muss mindestens 1 betragen, und für die meisten Anwendungen ist 5 ausreichend. |
| s.accept() | Nimmt passiv TCP-Client-Verbindungen an und wartet (blockierend) auf das Eintreffen der Verbindung |
| Clientseitiger Socket | |
| s.connect() | Initialisiert aktiv eine TCP-Serververbindung. Im Allgemeinen ist das Format von address ein Tupel (hostname, port). Wenn die Verbindung fehlschlägt, wird ein socket.error zurückgegeben. |
| s.connect_ex() | Eine erweiterte Version der Funktion connect(), die bei einem Fehler einen Fehlercode zurückgibt, anstatt eine Ausnahme auszulösen |
| Socket-Funktionen für allgemeine Zwecke | |
| s.recv() | Empfängt TCP-Daten, die als String zurückgegeben werden. bufsize gibt die maximale Datenmenge an, die empfangen werden kann. flag liefert zusätzliche Informationen über die Nachricht und kann normalerweise ignoriert werden. |
| s.send() | Sendet TCP-Daten und überträgt die Daten aus string an den verbundenen Socket. Der Rückgabewert ist die Anzahl der gesendeten Bytes, die kleiner sein kann als die Bytegröße des Strings. |
| s.sendall() | Sendet TCP-Daten vollständig. Überträgt die Daten aus string an den verbundenen Socket, versucht jedoch, alle Daten zu senden, bevor die Funktion zurückkehrt. Gibt bei Erfolg None zurück, löst bei einem Fehler eine Ausnahme aus. |
| s.recvfrom() | Empfängt UDP-Daten, ähnlich wie recv(), aber der Rückgabewert ist (data, address). Hierbei ist data ein String, der die empfangenen Daten enthält, und address ist die Socket-Adresse, von der die Daten gesendet wurden. |
| s.sendto() | Sendet UDP-Daten, indem die Daten an den Socket gesendet werden. address ist ein Tupel in der Form (ipaddr, port), das die Remote-Adresse angibt. Der Rückgabewert ist die Anzahl der gesendeten Bytes. |
| s.close() | Schließt den Socket |
| s.getpeername() | Gibt die Remote-Adresse des verbundenen Sockets zurück. Der Rückgabewert ist normalerweise ein Tupel (ipaddr, port). |
| s.getsockname() | Gibt die eigene Adresse des Sockets zurück. Normalerweise ein Tupel (ipaddr, port) |
| s.setsockopt(level,optname,value) | Setzt den Wert der angegebenen Socket-Option. |
| s.getsockopt(level,optname[.buflen]) | Gibt den Wert der Socket-Option zurück. |
| s.settimeout(timeout) | Legt die Timeout-Zeit für Socket-Operationen fest. timeout ist eine Fließkommazahl in Sekunden. Ein Wert von None bedeutet keine Timeout-Zeit. Im Allgemeinen sollte die Timeout-Zeit festgelegt werden, wenn der Socket gerade erstellt wurde, da sie für Verbindungsoperationen (wie connect()) verwendet werden kann |
| s.gettimeout() | Gibt den aktuellen Timeout-Wert in Sekunden zurück; wenn keine Timeout-Zeit festgelegt ist, wird None zurückgegeben. |
| s.fileno() | Gibt den Dateideskriptor des Sockets zurück. |
| s.setblocking(flag) | Wenn flag False ist, wird der Socket in den nicht blockierenden Modus versetzt; andernfalls wird der Socket in den blockierenden Modus versetzt (Standardeinstellung). Im nicht blockierenden Modus wird eine socket.error-Ausnahme ausgelöst, wenn recv() keine Daten findet oder send() Daten nicht sofort senden kann. |
| s.makefile() | Erstellt eine Datei, die mit diesem Socket verknüpft ist |
Einfaches Beispiel
Server
Wir verwenden diesocket-Funktion des socket-Moduls, um ein Socket-Objekt zu erstellen. Das Socket-Objekt kann durch Aufrufen anderer Funktionen einen Socket-Dienst einrichten.
Jetzt können wir diebind(hostname, port)Funktion aufrufen, um denPort des Dienstes anzugeben。
Als Nächstes rufen wir dieaccept-Methode des Socket-Objekts auf. Diese Methode wartet auf eine Client-Verbindung und gibt dasconnectionObjekt zurück, was anzeigt, dass es sich mit dem Client verbunden hat.
Der vollständige Code sieht wie folgt aus:
Beispiel
# Dateiname: server.py
# Importiere die Module socket, sys
import socket
import sys
# Erstelle ein Socket-Objekt
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
# Lokalen Hostnamen abrufen
host = socket.gethostname()
port = 9999
# An die Portnummer binden
serversocket.bind((host, port))
# Maximale Anzahl von Verbindungen festlegen; darüber hinaus in die Warteschlange einreihen
serversocket.listen(5)
while True:
# Client-Verbindung herstellen
clientsocket,addr = serversocket.accept()
print("Verbindungsadresse: %s" % str(addr))
msg='Willkommen beim Beispiel-Tutorial!'+ "\r\n"
clientsocket.send(msg.encode('utf-8'))
clientsocket.close()
Client
Als Nächstes schreiben wir ein einfaches Client-Beispiel, um eine Verbindung zu dem oben erstellten Dienst herzustellen. Die Portnummer ist 9999.
socket.connect(hostname, port )Methode öffnet eine TCP-Verbindung zum HosthostnameportportVerbindung zum Dienst herstellen. Nach dem Verbinden können wir Daten vom Server abrufen. Denken Sie daran, dass Sie die Verbindung nach Abschluss des Vorgangs schließen müssen.
Der vollständige Code sieht wie folgt aus:
Beispiel
# Dateiname: client.py
# Importiere die Module socket, sys
import socket
import sys
# Erstelle ein Socket-Objekt
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Lokalen Hostnamen abrufen
host = socket.gethostname()
# Portnummer festlegen
port = 9999
# Verbindung zum Dienst herstellen, Host und Port angeben
s.connect((host, port))
# Daten kleiner als 1024 Bytes empfangen
msg = s.recv(1024)
s.close()
print (msg.decode('utf-8'))
Jetzt öffnen wir zwei Terminals. Im ersten Terminal führen Sie die Datei server.py aus:
$ python3 server.py
Führen Sie im zweiten Terminal die Datei client.py aus:
$ python3 client.py 欢迎访问Example!
Wenn wir nun das erste Terminal erneut öffnen, sehen wir die folgende Informationsausgabe:
连接地址: ('192.168.0.118', 33397)
Python-Internet-Module
Das Folgende listet einige wichtige Module für die Python-Netzwerkprogrammierung auf:
| Protokoll | Funktion/Zweck | Portnummer | Python-Modul |
|---|---|---|---|
| HTTP | Webzugriff | 80 | httplib, urllib, xmlrpclib |
| NNTP | Nachrichtenartikel lesen und veröffentlichen, allgemein bekannt als "Posts" | 119 | nntplib |
| FTP | Dateiübertragung | 20 | ftplib, urllib |
| SMTP | E-Mail senden | 25 | smtplib |
| POP3 | E-Mail empfangen | 110 | poplib |
| IMAP4 | E-Mail abrufen | 143 | imaplib |
| Telnet | Befehlszeile | 23 | telnetlib |
| Gopher | Informationsabfrage | 70 | gopherlib, urllib |
Weitere Informationen finden Sie auf der offiziellen Website zuPython Socket Library and Modules。
Weitere Erweiterungen