Python - Sockets-Programmierung

Python bietet zwei Zugriffsebenen auf 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.

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. Wir verwenden das Socket-Modul in Python, um Sockets zu erstellen und zu verwenden.

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 Socket - Modul

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.

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.

Ruf jetzt an bind(hostname, port)Funktion zum Angeben eines Ports für Ihren Dienst auf dem angegebenen Host.

Rufen Sie als Nächstes die accept- Methode 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/python           # This is server.py file
import socket               # Import socket module
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port
s.listen(5)                 # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print 'Got connection from', addr
   c.send('Thank you for connecting')
   c.close()                # Close the connection

Ein einfacher Client

Schreiben wir ein sehr einfaches Client-Programm, das eine Verbindung zu einem bestimmten Port 12345 und einem bestimmten Host herstellt. Dies ist sehr einfach, um 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.

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/python           # This is client.py file
import socket               # Import socket module
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.connect((host, port))
print s.recv(1024)
s.close                     # Close the socket when done

Führen Sie nun diese server.py im Hintergrund und dann über 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

Dies würde folgendes Ergebnis liefern -

Got connection from ('127.0.0.1', 48437)
Thank you for connecting

Socket mit öffentlicher URL

Im folgenden Beispiel verwenden wir einige Methoden aus dem Socket-Modul, um die Adressinformationen der Server- und Hostnamen zu ermitteln.

import socket
from pprint import pprint
# get server address
addrinfo = socket.getaddrinfo('tutorialspoint.com', 'www')
pprint(addrinfo)
# get server hostname
print socket.gethostname()

Wenn wir das obige Programm ausführen, erhalten wir die folgende Ausgabe:

[(2, 1, 0, '', ('94.130.81.180', 80))]
DESKTOP-JXYKQCPLP