Einführung in die Netzwerkprogrammierung in Python

Dieses Tutorial enthält eine Einführung in Sockets in Python und die Verwendung des Socketmoduls zum Erstellen von HTTP-Servern und -Clients in Python. Es wird sich auch auf Tornado beziehen, eine Python-Netzwerkbibliothek, die sich ideal für lange Abfragen, WebSockets und andere Anwendungen eignet, die eine langlebige Verbindung zu jedem Benutzer benötigen.

Was sind Steckdosen??

Ein Socket ist eine Verbindung zwischen zwei Anwendungen, die miteinander kommunizieren können (entweder lokal auf einem einzelnen Computer oder remote zwischen zwei Computern an unterschiedlichen Standorten)..

Grundsätzlich fungieren Sockets als Kommunikationsverbindung zwischen zwei Entitäten, d. H. Einem Server und einem Client. Ein Server gibt Informationen aus, die von einem Client angefordert werden. Wenn Sie beispielsweise diese Seite besucht haben, hat der Browser einen Socket erstellt und eine Verbindung zum Server hergestellt.

Das Sockelmodul

Um einen Socket anzulegen, verwenden Sie die socket.socket () Funktion und die Syntax ist so einfach wie:

Socket importieren s = socket.socket (socket_family, socket_type, protocol = 0)

Hier ist die Beschreibung der Argumente:

  • socket_family: Stellt die Adressfamilie (und das Protokoll) dar. Es kann entweder AF_UNIX oder AF_INET sein.
  • Steckdosentyp: Stellt den Socket-Typ dar und kann entweder SOCK_STREAM oder SOCK_DGRAM sein.
  • Protokoll: Dies ist ein optionales Argument, das standardmäßig auf 0 gesetzt ist.

Nachdem Sie Ihr Socket-Objekt abgerufen haben, können Sie mit den im Socket-Modul verfügbaren Methoden nach Wunsch einen Server oder Client erstellen.

Erstellen Sie einen einfachen Client

Bevor wir loslegen, werfen wir einen Blick auf die in Python verfügbaren Client-Socket-Methoden.

  • s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
  • s.connect (): Initiiert eine TCP-Server-Verbindung.

Um einen neuen Socket anzulegen, importieren Sie zuerst die Socket-Methode der Socket-Klasse.

Importsockel

Als Nächstes erstellen wir einen Stream-Socket (TCP) wie folgt:

stream_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM)

Das AF_INET Ein Argument zeigt an, dass Sie einen IP-Socket (Internet Protocol), insbesondere IPv4, anfordern. Das zweite Argument ist der Transportprotokolltyp SOCK_STREAM für TCP-Sockets. Darüber hinaus können Sie auch einen IPv6-Socket erstellen, indem Sie den Socket angeben AF_INET6 Streit.

Geben Sie den Server an.

server = "localhost"

Geben Sie den Port an, mit dem Sie kommunizieren möchten.

Port = 80

Verbinden Sie den Socket mit dem Port, den der Server überwacht.

server_address = ((host, port)) stream_socket.connect (server_address) 

Es ist wichtig zu wissen, dass der Host und der Port ein Tupel sein müssen.

Senden Sie eine Datenanforderung an den Server:

message = 'message' stream_socket.sendall (message)

Holen Sie sich die Antwort vom Server:

data = sock.recv (10) Druckdaten

Um einen verbundenen Socket zu schließen, verwenden Sie die close-Methode:

stream_socket.close ()

Unten ist der vollständige Code für den Client / Server.

import socket import sys # Erstellen Sie einen TCP / IP-Socket. stream_socket = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # Definieren Sie host host = 'localhost' # definieren Sie den Kommunikationsport port = 8080 # Verbinden Sie den Socket mit dem Port, an dem der Server lauscht Server_Adresse = ((Host, Port)) print "Verbinden" stream_socket.connect (Server_Adresse) # Daten senden message = 'message' stream_socket.sendall (message) # Antwortdaten = stream_socket.recv (10) print data print ' Socket geschlossen 'stream_socket.close () 

Erstellen Sie einen einfachen Server

Schauen wir uns nun einen einfachen Python-Server an. Im Folgenden sind die in Python verfügbaren Socket-Servermethoden aufgeführt.

  • s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
  • s.bind (): Bindet die Adresse (Hostname, Portnummer) an Socket.
  • s.listen (): Stellt den TCP-Listener ein und startet ihn.
  • s.accept (): Akzeptiert eine TCP-Clientverbindung.

Wir folgen den folgenden Schritten: 

  • Erstellen Sie eine Steckdose.
  • Binden Sie den Socket an einen Port.
  • Beginnen Sie, Verbindungen auf der Steckdose zu akzeptieren.

Hier ist das Serverprogramm.

import socket import sys # Erzeuge einen TCP / IP-Socket sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM) # Definiere host host = 'localhost' # definiere den Kommunikationsport Port = 8080 # Binde den Socket an die Port-Socke. bind ((host, port)) # Auf eingehende Verbindungen warten sock.listen (1) # Auf Verbindung warten Warten auf Verbindung warten, client = sock.accept () Druckclient, 'verbunden' # Daten empfangen in kleinen Blöcken und erneutes Übertragen data = connection.recv (16) print 'empfang "% s"'% data, wenn data: connection.sendall (data) ansonsten: print 'keine Daten von', Client # Schließen Sie die Verbindung connection.close () 

Der Server ist jetzt bereit für eingehende Verbindungen.

Führen Sie nun die Client- und Serverprogramme in separaten Terminalfenstern aus, damit sie miteinander kommunizieren können.

Server-Ausgabe

$ python server.py wartet auf eine Verbindung ('127.0.0.1', 47050), die Verbindung erhalten hat "Nachricht" 

Client-Ausgabe

$ python client.py Verbindungsnachrichtensocket geschlossen 

Das Tornado-Framework

Das Tornado-Framework ist eine der für die Netzwerkprogrammierung in Python verfügbaren Bibliotheken. In diesem Abschnitt werden wir diese Bibliothek diskutieren und zeigen, wie Sie WebSockets damit erstellen können.

Tornado ist ein Python-Web-Framework und eine asynchrone Netzwerkbibliothek. Tornado verwendet die nicht blockierenden Netzwerk-E / A und kann daher auf zehntausende offene Verbindungen skaliert werden. Diese Eigenschaft macht es ideal für lange Abfragen, WebSockets und andere Anwendungen, die eine langlebige Verbindung zu jedem Benutzer erfordern.

Erstellen Sie ein einfaches Tornado-WebSocket:

import tornado.ioloop import tornado.web-Klasse ApplicationHandler (tornado.web.RequestHandler): def get (self): self.message = message = "" "  Tornado-Rahmen  Willkommen im Tornado-Framework  "" "self.write (message) wenn __name__ ==" __main__ ": application = tornado.web.Application ([(r" / ", ApplicationHandler),]) application.listen (5001) tornado.ioloop.Ioloop.instance ().Start() 

Im obigen Code:

  • Wir definieren die Klasse ApplicationHandler der als Handler für eine Anfrage dient und eine Antwort mit der Antwort zurückgibt schreiben() Methode.
  • Das Main Methode ist der Eintrag für das Programm.
  • tornado.web.anwendung erstellt eine Basis für die Webanwendung und nimmt eine Reihe von Handlern, d. h. ApplicationHandler, entgegen.
  • Die Anwendung wartet auf Port 5000, und ein Client kann mit dieser Anwendung über denselben Port kommunizieren.
  • tornado.ioloop.IOLoop.instance (). start () erstellt einen nicht blockierenden Thread für eine Anwendung.

Wenn wir die Anwendung ausführen, erhalten wir das Ergebnis wie in der Abbildung unten gezeigt.

Fazit

Inzwischen müssen Sie die Grundlagen der Socket-Programmierung in Python verstanden haben und wissen, wie Sie einen einfachen Server und Client erstellen können. Experimentieren Sie mit Ihrem eigenen Chat-Client. Weitere Informationen finden Sie in den offiziellen Python-Dokumenten.

Zögern Sie nicht, zu sehen, was wir für den Verkauf und das Studium auf dem Envato-Markt zur Verfügung haben, und zögern Sie nicht, Fragen zu stellen und mit dem untenstehenden Feed wertvolles Feedback zu geben.