Python-Netzwerkprogrammierung
Python bietet Netzwerkdienste auf zwei Zugriffsebenen:
- Low-Level-Netzwerkdienste unterstützen grundlegende Sockets und stellen die standardmäßige BSD-Sockets-API bereit, die auf alle Methoden der zugrunde liegenden Socket-Schnittstelle des Betriebssystems zugreifen kann.
- Das High-Level-Netzwerkdienstmodul SocketServer bietet serverzentrierte Klassen, die die Entwicklung von Netzwerkservern vereinfachen.
Was ist ein Socket?
Ein Socket wird auch als 'Socket' bezeichnet. Anwendungen stellen normalerweise Anfragen an das Netzwerk oder beantworten Netzwerkanfragen über den 'Socket', 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. 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 je nachdem, ob er verbindungsorientiert oder verbindungslos ist, unterteilt werden in:
SOCK_STREAModerSOCK_DGRAM。 - protocol: Wird im Allgemeinen nicht angegeben; der Standardwert ist 0.
Socket-Objekt-Methoden (integriert)
| Funktion | Beschreibung |
|---|---|
| Serverseitige Sockets | |
| 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() | TCP-Listening starten. backlog gibt die maximale Anzahl von Verbindungen an, die das Betriebssystem in die Warteschlange stellen kann, bevor Verbindungen abgelehnt werden. Dieser Wert muss mindestens 1 sein; für die meisten Anwendungen ist die Einstellung auf 5 ausreichend. |
| s.accept() | Passiv TCP-Client-Verbindungen annehmen und (blockierend) auf das Eintreffen der Verbindung warten. |
| Clientseitige Sockets | |
| s.connect() | Aktiv eine TCP-Serververbindung initialisieren. Im Allgemeinen hat address die Form eines Tupels (hostname, port). Wenn die Verbindung fehlschlägt, wird ein socket.error zurückgegeben. |
| s.connect_ex() | Eine erweiterte Version der Funktion connect(); bei einem Fehler gibt sie einen Fehlercode zurück, anstatt eine Ausnahme auszulösen. |
| Socket-Funktionen für den allgemeinen Gebrauch | |
| s.recv() | TCP-Daten empfangen; die Daten werden als String zurückgegeben. 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() | TCP-Daten senden. Sendet die Daten in string an den verbundenen Socket. Der Rückgabewert ist die Anzahl der gesendeten Bytes, die kleiner als die Byte-Größe von string sein kann. |
| s.sendall() | TCP-Daten vollständig senden. Sendet die Daten in string an den verbundenen Socket, versucht jedoch, alle Daten vor der Rückkehr zu senden. Gibt bei Erfolg None zurück oder löst bei Fehler eine Ausnahme aus. |
| s.recvfrom() | UDP-Daten empfangen, ähnlich wie recv(), aber der Rückgabewert ist (data, address). data ist ein String, der die empfangenen Daten enthält, und address ist die Socket-Adresse, die die Daten gesendet hat. |
| s.sendto() | UDP-Daten senden. Sendet Daten an den Socket; 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 üblicherweise ein Tupel (ipaddr, port). |
| s.getsockname() | Gibt die eigene Adresse des Sockets zurück. Normalerweise ein Tupel (ipaddr, port). |
| s.setsockopt(level,optname,value) | Legt den Wert der angegebenen Socket-Option fest. |
| s.getsockopt(level,optname[.buflen]) | Gibt den Wert der Socket-Option zurück. |
| s.settimeout(timeout) | Legt die Timeout-Dauer für Socket-Operationen fest. timeout ist ein Float in Sekunden. Ein Wert von None bedeutet keine Timeout-Dauer. Im Allgemeinen sollte das Timeout beim ersten Erstellen des Sockets festgelegt werden, da es für Verbindungsvorgänge (wie connect()) verwendet werden kann. |
| s.gettimeout() | Gibt den aktuellen Timeout-Wert in Sekunden zurück; wenn keine Timeout-Dauer festgelegt ist, wird None zurückgegeben. |
| s.fileno() | Gibt den Dateideskriptor des Sockets zurück. |
| s.setblocking(flag) | Wenn flag 0 ist, setzen Sie den Socket auf den nicht blockierenden Modus; andernfalls setzen Sie den Socket auf den blockierenden Modus (Standard). Im nicht blockierenden Modus löst recv() eine socket.error-Ausnahme aus, wenn keine Daten gefunden werden, oder send() Daten nicht sofort senden kann. |
| s.makefile() | Erstellen Sie eine Datei, die diesem Socket zugeordnet 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 einconnection-Objekt zurück, das anzeigt, dass es mit dem Client verbunden ist.
Der vollständige Code sieht wie folgt aus:
Beispiel
Client
Als Nächstes schreiben wir ein einfaches Client-Beispiel, um eine Verbindung zu dem oben erstellten Dienst herzustellen. Die Portnummer ist 12345.
socket.connect(hostname, port )Methode öffnet eine TCP-Verbindung zum Hosthostnameund Portportdes Servers. Sobald die Verbindung hergestellt ist, können wir Daten vom Server abrufen. Denken Sie daran, die Verbindung nach Abschluss der Vorgänge zu schließen.
Der vollständige Code sieht wie folgt aus:
Beispiel
Jetzt öffnen wir zwei Terminals. Im ersten Terminal führen Sie die Datei server.py aus:
$ python server.py
Führen Sie im zweiten Terminal die Datei client.py aus:
$ python client.py 欢迎访问Example!
Wenn wir nun das erste Terminal erneut öffnen, sehen wir die folgende Ausgabe:
连接地址: ('192.168.0.118', 62461)
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 posten, 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 | Kommandozeile | 23 | telnetlib |
| Gopher | Informationsabfrage | 70 | gopherlib, urllib |
Weitere Informationen finden Sie auf der offiziellen Website unterPython-Socket-Bibliothek und Module。
Weitere Erweiterungen.