Python Socket-Programmierung: Client, Server, Peer-Bibliotheken
Published: 2023-12-11 09:20:21

In diesem Tutorial lernen Sie, wie Sie mit Hilfe der Python-Socket-Programmierung und der Socket-API Daten zwischen einem Client und einem Server austauschen können. Später wird in diesem Tutorial der direkte Datenaustausch zwischen zwei oder mehreren Python-Clients unter Verwendung eines gehosteten Providers behandelt. Der in diesem Tutorial verwendete Quellcode befindet sich im [GitHub-Repository](https://github.com/PubNubDevelopers/python-socket-demo).

Die Socket-Programmierung verbindet zwei Sockets (einen Client-Socket und einen Server-Socket) und ermöglicht ihnen die bidirektionale Kommunikation in Echtzeit. Direkte Socket-Verbindungen sind für alle Echtzeit-Anwendungen von Vorteil, da Daten jederzeit gesendet oder empfangen werden können.

Ist Python für die Socket-Programmierung geeignet?
--------------------------------------------------

Ja! Python eignet sich hervorragend für die Socket-Programmierung, da es viele der erforderlichen Module wie Socket, Select und Asyncio enthält, um Client-Server-Anwendungen zu erstellen.

### Wofür werden Python-Sockets verwendet?

Python-Sockets werden für Anwendungen verwendet, die über ein Netzwerk kommunizieren müssen: z. B. Webserver, Chat-Anwendungen oder E-Mail-Clients. Das Serverprogramm hört zu und bearbeitet eingehende Verbindungen, während der Client sich mit dem Server verbindet, um Daten zu senden und zu empfangen. Python-Sockets unterstützen sowohl [TCP, ein](https://www.pubnub.com/guides/tcp-ip/)zuverlässiges Protokoll, das die ordnungsgemäße Zustellung von Paketen gewährleistet, als auch [UDP, ein](https://www.pubnub.com/guides/udp/)verbindungsloses und leichtgewichtiges Protokoll für Anwendungen, bei denen Paketverluste akzeptabel sind.

### Wie führe ich ein Socket-Programm in Python aus?

Die folgende Anleitung zeigt Ihnen, wie Sie einen Python-Client und -Server erstellen, die miteinander kommunizieren können. Sie müssen beide Programme getrennt voneinander ausführen, d.h.:

`python myServer.py`

`python meinClient.py`

**Python-Programmierumgebung** einrichten
-----------------------------------------

Sie benötigen eine stabile Version von [Python Version 3.x](https://www.python.org/downloads/) Wenn Sie Windows verwenden, haben Sie die Möglichkeit, Python zu Ihrem PATH hinzuzufügen.

Außerdem benötigen Sie einen Code-Editor, um diesem Tutorial folgen zu können. [Visual Studio Code](https://code.visualstudio.com/) ist ein beliebter, kostenloser Open-Source-Code-Editor, der viele Sprachen und Frameworks unterstützt, darunter auch Python. VSCode unterstützt auch Erweiterungen für Python, die bei der Code-Vervollständigung und beim Debuggen helfen.

Erstellen und Ausführen einer Python-Socket-Anwendung
-----------------------------------------------------

Lassen Sie uns eine einfache Socket-Anwendung mit Python erstellen. Python bietet eine native [Socket-Klasse](https://docs.python.org/3/library/socket.html) (Socket-Modul), so dass Entwickler nicht auf externe Bibliotheken angewiesen sind. Beginnen Sie damit, den Python-Socket-Programmier-Client und -Server einzurichten:

![](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1jhj/bf547110b07a076c30bac70e1b5a7e9a/python-socket-connection-diagram.png)

### Importieren Sie Ihre Python-Socket-Bibliothek

Erstellen Sie die Dateiclient.py im Projektverzeichnis. Um Sockets zu verwenden, importieren Sie die Python-Socket-Bibliothek und erstellen ein neues Socket-Objekt, das eine Verbindung zu einer bestimmten IP-Adresse herstellt (in diesem Fall localhost am Port 8080, aber Sie können eine beliebige IPv4-Adresse wählen). Erstellen Sie eine neue Verbindung zum Socket-Server, senden Sie Daten an den TCP-Server und schließen Sie die Socket-Verbindung.

Ihre Datei client.py sollte wie folgt aussehen:

```js
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('0.0.0.0', 8080))
client.send("I am CLIENT\n".encode())
from_server = client.recv(4096)
client.close()
print (from_server.decode())
```

Sie benötigen einen Socket-Server, der auf eingehende Verbindungen und Nachrichten von Ihrem Client wartet. Erstellen Sie die Datei server.py und fügen Sie den folgenden Inhalt hinzu:

```js
import socket
serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serv.bind(('0.0.0.0', 8080))
serv.listen(5)
while True:
  conn, addr = serv.accept()
  from_client = ''
  while True:
    data = conn.recv(4096)
    if not data: break
    from_client += data.decode('utf8')
    print (from_client)
    conn.send("I am SERVER\n".encode())
  conn.close()
print ('client disconnected and shutdown')
```

Server.py bindet das Socket-Objekt an den Hostnamen (localhost) auf Port 8080 und lauscht ständig auf neue Client-Verbindungen. Wenn sich ein Client mit dieser Adresse verbindet, nimmt der Server die Verbindung an und liest alle Daten. Sobald die Daten erfolgreich vom Client gelesen wurden, liefert der Server eine Antwort, woraufhin der Client die Verbindung beendet.

### Testen Sie Ihre Python-Socket-Programmierung

Um dies selbst zu testen, öffnen Sie zwei Terminal-Fenster gleichzeitig. In einem Fenster führen Sie aus:

```js
python3 server.py
```

Im zweiten Fenster: run:

```js
python3 client.py
```

Beachten Sie, dass der Server weiterläuft und jedes Mal, wenn Sie den Client ausführen, eine neue Verbindung herstellt und eine neue Ausgabe anhängt.

Der Client sendet den String "I am CLIENT" an den Server und wartet auf eine Antwort. Der Server liest die Nachricht des Clients, gibt sie auf dem Terminal aus und sendet eine Antwort an den Client zurück.

![](https://images.ctfassets.net/3prze68gbwl1/6Y2HAKVJOGza5CUHcJyg8k/2480975a9fecd808b273cdf834ecb65b/python_sockets.png)

Socket-Programmierung in Python mit PubNub
------------------------------------------

Bisher wurde in diesem Tutorial der Austausch von Nachrichten zwischen einem Server und einem Client behandelt. Was aber, wenn Sie direkt zwischen Python-Clients kommunizieren müssen?

Das direkte Senden von Daten zwischen zwei oder mehr Client-Geräten ist schwierig, da mit zunehmender Anzahl von Geräten viele Skalierungs- und Sicherheitsaspekte zu beachten sind. Eine Client-Server-Architektur wird verwendet, um die Kommunikation zwischen den Clients zu moderieren und zu verwalten. Wenn Sie keinen Webserver haben oder sich Sorgen um die Skalierung Ihres Servers machen, um die Anforderungen Ihrer Anwendung zu erfüllen, sollten Sie sich für eine gehostete Echtzeit-Kommunikationslösung wie [PubNub](https://www.pubnub.com/). PubNub ist eine global verteilte und skalierbare Cloud-Plattform, so dass Sie sich nicht um die Bereitstellung und Wartung von Servern kümmern müssen. Die plattformübergreifenden SDKs von PubNub, einschließlich [Python](https://www.pubnub.com/docs/sdks/python)können Benutzer identifizieren und Nachrichten an bestimmte Kanäle senden, die nur von abonnierten Clients empfangen werden können.

### Client-to-Client-Programmierung mit Python-Sockets

Wie könnte nun die zuvor vorgestellte einfache Anwendung mit PubNub geschrieben werden, um Nachrichten direkt zwischen zwei Clients auszutauschen? Es ist wichtig zu verstehen, dass PubNub zwar die "publish"- und "subscribe"-Architektur (pub/sub) verwendet, um bidirektionale Nachrichten zwischen Endpunkten zu senden und zu empfangen, aber hinter den Kulissen immer noch Sockets verwendet. PubNub bietet Ihnen die Vorteile der Socket-Kommunikation, ohne dass Sie sich um die Details der Python-Netzwerkprogrammierung und die Aufrechterhaltung einer ständig aktiven Verbindung zwischen Ihren Clients kümmern müssen, unabhängig vom Betriebssystem.

Um PubNub in das Projekt zu integrieren, installieren Sie das PubNub-Paket mit pip im Terminal; dies ermöglicht Ihnen die Verwendung des [PubNub Python SDK](https://www.pubnub.com/docs/sdks/python) zu verwenden und mit der PubNub-Infrastruktur zu kommunizieren.

```js
pip3 install 'pubnub>=7.1.0'
```

Sie müssen zwei Clients erstellen, die sich mit dem PubNub-Netzwerk verbinden und darüber kommunizieren. Erstellen Sie eine Datei pn\_client\_1.py und fügen Sie den folgenden Code ein:

```js
from pubnub.callbacks import SubscribeCallback
from pubnub.enums import PNStatusCategory
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub
import time
import os
pnconfig = PNConfiguration()
userId = os.path.basename(__file__)
pnconfig.publish_key = 'demo'
pnconfig.subscribe_key = 'demo'
pnconfig.user_id = userId
pnconfig.ssl = True
pubnub = PubNub(pnconfig)
def my_publish_callback(envelope, status):
  # Check whether request successfully completed or not
  if not status.is_error():
    pass
class MySubscribeCallback(SubscribeCallback):
  def presence(self, pubnub, presence):
    pass
  def status(self, pubnub, status):
    pass
  def message(self, pubnub, message):
    if message.publisher == userId : return
    print ("from device " + message.publisher + ": " + message.message)
pubnub.add_listener(MySubscribeCallback())
pubnub.subscribe().channels("chan-1").execute()
## publish a message
while True:
  msg = input("")
  if msg == 'exit': os._exit(1)
  pubnub.publish().channel("chan-1").message(str(msg)).pn_async(my_publish_callback)
```

Erstellen Sie die Datei pn\_client\_2.py und fügen Sie denselben Code wie für pn\_client\_1.py ein.

Der obige Code verwendet "Demo"-Schlüssel, aber Sie können Ihre eigenen [PubNub-Schlüssel](https://admin.pubnub.com/#/register) kostenlos erhalten.

Führen Sie pn\_client\_1.py und pn\_client\_2.py gleichzeitig in zwei verschiedenen Terminalfenstern aus

```js
python3 pn_client_1.py
```

```js
python3 pn_client_2.py
```

Jeder Client initialisiert seine Verbindung zum PubNub-Netzwerk und abonniert den Empfang neuer Nachrichten, sobald diese auf dem Kanal "chan-1" veröffentlicht werden. Hinter den Kulissen erstellt und verwaltet PubNub den Socket für Sie und leitet Ihre Nachricht an alle Clients weiter, die auf sie warten. Sobald der entfernte Client die Nachricht erhält, wird die empfangene Nachricht in der Befehlszeile angezeigt.

![](https://images.ctfassets.net/3prze68gbwl1/7BRsG0oVaACcE34x7eC0yC/475d6a894f0bc535bc70d213a9e8c189/python_pubnub.png)

Und das war's dann auch schon!

Was ist die Alternative zu Sockets in Python?
---------------------------------------------

Weitere Informationen über die Entwicklung mit PubNub finden Sie in einer Reihe von [Tutorials](https://www.pubnub.com/tutorials/) und [Demos](https://www.pubnub.com/demos/)Alternativ können Sie auch die [PubNub interaktive Tour](https://www.pubnub.com/tour/introduction/) um zu verstehen, wie die Plattform Echtzeit-Interaktivität für Anwendungen bietet. PubNub unterstützt TCP- und UDP-Datagramm-Kommunikation sowie Linux, Unix und Windows.

Wir verfügen über eine umfangreiche Sammlung von Ressourcen zum Thema Realtime Messaging, einschließlich von Experten verfasster Artikel und Leitfäden zu Websockets. Hier sind einige wertvolle Links, die Sie erkunden können.

-   [Was sind Websockets?](https://www.pubnub.com/guides/what-are-websockets-and-when-should-you-use-them/)
    
-   [PubNub-Ressourcen](https://www.pubnub.com/resources)
    
-   [PubNub-Blog](https://www.pubnub.com/blog/)
    

Wie kann PubNub Ihnen helfen?
=============================

Dieser Artikel wurde ursprünglich auf [PubNub.com](https://pubnub.com/blog/socket-programming-in-python-client-server-p2p/) veröffentlicht

Unsere Plattform unterstützt Entwickler bei der Erstellung, Bereitstellung und Verwaltung von Echtzeit-Interaktivität für Webanwendungen, mobile Anwendungen und IoT-Geräte.

Die Grundlage unserer Plattform ist das größte und am besten skalierbare Echtzeit-Edge-Messaging-Netzwerk der Branche. Mit über 15 Points-of-Presence weltweit, die 800 Millionen monatlich aktive Nutzer unterstützen, und einer Zuverlässigkeit von 99,999 % müssen Sie sich keine Sorgen über Ausfälle, Gleichzeitigkeitsgrenzen oder Latenzprobleme aufgrund von Verkehrsspitzen machen.

PubNub erleben
--------------

Sehen Sie sich die [Live Tour](https://www.pubnub.com/tour/introduction/) an, um in weniger als 5 Minuten die grundlegenden Konzepte hinter jeder PubNub-gestützten App zu verstehen

Einrichten
----------

Melden Sie sich für einen [PubNub-Account](https://admin.pubnub.com/signup/) an und erhalten Sie sofort kostenlosen Zugang zu den PubNub-Schlüsseln

Beginnen Sie
------------

Mit den [PubNub-Dokumenten](https://www.pubnub.com/docs) können Sie sofort loslegen, unabhängig von Ihrem Anwendungsfall oder [SDK](https://www.pubnub.com/docs)