Website-Suche

So schreiben Sie eine Client- und Server-Rechneranwendung mit Python und ZeroMQ


ZeroMQ oder kurz ZMQ ist eine eingebettete Netzwerkbibliothek. ZMQ bietet Ihnen einen Socket, der kleine/atomare Nachrichten vom Client zum Server und umgekehrt überträgt. Sie können mit ZMQ Eins-zu-Eins-, Eins-zu-viele- und viele-zu-viele-Socket-Kommunikationen erstellen. Das asynchrone I/O-Modell ermöglicht es Ihnen, sehr schnelle und skalierbare Messaging-Anwendungen zu entwickeln.

In diesem Artikel zeigen wir Ihnen, wie Sie eine einfache Client-Server-Taschenrechner-App mit der ZeroMQ-Python-Bibliothek schreiben. Dieser Artikel hilft Ihnen, sich mit ZeroMQ vertraut zu machen. Dieser Artikel behandelt die folgenden Themen von ZeroMQ:

  • Einen ZeroMQ-Kontext erstellen
  • Erstellen eines ZeroMQ-Anforderungs-Sockets
  • Erstellen eines ZeroMQ-Antwortsockets
  • Ein ZeroMQ-Socket binden
  • Verbindung zu einem ZeroMQ-Antwortsocket herstellen
  • Verwendung der ZeroMQ recv() Funktion
  • Verwendung der ZeroMQ send() Funktion
  • Schließen eines ZeroMQ-Sockets

Inhaltsverzeichnis:

  • ZeroMQ installieren
  • Erstellen eines Projektverzeichnisses und von Projektdateien
  • Das Schreiben des ZeroMQ-Servercodes
  • Das Schreiben des ZeroMQ-Client-Codes
  • Wie das Client-Server ZeroMQ Taschenrechnerprogramm funktioniert
  • Erklärung des ZeroMQ-Servercodes
  • Erklärung des ZeroMQ-Client-Codes
  • Testen der ZeroMQ Client-Server Taschenrechner-App
  • Fazit

ZeroMQ installieren

Wenn Sie Unterstützung bei der Installation von ZeroMQ auf Ubuntu 22.04 LTS oder einem anderen Betriebssystem mit installiertem Python PIP benötigen, lesen Sie den Artikel über die Installation von ZeroMQ auf Ubuntu 22.04 LTS und die Verwendung mit Python 3.

Erstellen eines Projektverzeichnisses und von Projektdateien

Um alles organisiert zu halten, erstellen Sie ein neues Projektverzeichnis ~/projects/zmq-python (sagen wir mal) mit folgendem Befehl:

mkdir -pv ~/projects/zmq-python

Navigieren Sie wie folgt zum neu erstellten Projektverzeichnis ~/projects/zmq-python:

cd ~/projects/zmq-python

Erstellen Sie zwei Python-Skripte, "client.py" und "server.py", im Projektverzeichnis ~/projects/zmq-python mit folgendem Befehl:

touch client.py server.py

Schließlich sollte das Projektverzeichnis wie folgt aussehen:

ls -lh

Das Schreiben des ZeroMQ-Servercodes

Geben Sie die folgenden Codezeilen in die Datei "server.py" ein und speichern Sie die Datei:

import zmq

context = zmq.Context()
socket = context.socket(zmq.REP) 
socket.bind("tcp://*:5000")

print("ZeroMQ server is ready...")


def decode_client_data(client_data):

    client_data = list(map(float, client_data.split(b',')))     client_data[0] = int(client_data[0])     return client_data num_requests = 0 while True:

    num_requests = num_requests + 1         try:

        client_data = socket.recv()     except KeyboardInterrupt:

        socket.close()         print("\nZeroMQ server is stopped.")         break         decoded_client_data = decode_client_data(client_data)     option = decoded_client_data[0]     num1 = decoded_client_data[1]     num2 = decoded_client_data[2]     match option:

        case 1:

            action = 'add'             result = num1 + num2         case 2:

            action = 'subtract'             result = num1 - num2         case 3:

            action = 'multiply'             result = num1 * num2         case 4:

            action = 'divide'             result = num1 / num2         print(f"request#{num_requests} action={action}, numbers=[{num1}, {num2}], result={result}")     socket.send(bytes(str(result), "utf-8"))

Nachdem Sie alle Codes eingegeben haben, sollte die Datei „server.py“ wie im folgenden Screenshot aussehen. Um zu erfahren, was der Code tut und wie er funktioniert, lesen Sie die Erklärung des ZeroMQ-Servercodes.

Das Schreiben des ZeroMQ-Client-Codes

Geben Sie die folgenden Codezeilen in die Datei "client.py" ein und speichern Sie die Datei:

import zmq

context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5000")

print("Connected to ZeroMQ server.")

def take_option_input():

    prompt = """ What do you want to do?     1. add numbers     2. subtract numbers     3. multiply numbers     4. divide numbers     5. exit -> """         try:

        option = input(prompt)     except KeyboardInterrupt:

        option = 5     return option def take_numbers_input():

    num1 = float(input("number 1: "))     num2 = float(input("number 2: "))     return [num1, num2] def encode_request_data(request_data):

    request_data_string = ','.join(map(str, request_data))     encoded_data = bytes(request_data_string, 'utf-8')     return encoded_data while True:

    option = int(take_option_input())     if option < 1 or option > 4: #option is 5 or outside range 1-4 - close client socket         socket.close()         print("\nClient disconnected from ZeroMQ server.")         break     numbers = take_numbers_input()     request_data = [option, *numbers]     encoded_data = encode_request_data(request_data)     socket.send(encoded_data)     result = float(socket.recv())     print(f"result is: {result}")

Nachdem Sie alle Codes eingegeben haben, sollte die Datei „client.py“ im Folgenden Screenshot aussehen. Um zu erfahren, was der Code tut und wie er funktioniert, lesen Sie die Erklärung des ZeroMQ-Clientcodes.

Wie das Client-Server ZeroMQ Taschenrechnerprogramm funktioniert

Die Datei "server.py" führt einen ZeroMQ-Server aus. Der Server hört auf Anfragen von ZeroMQ-Clients. Die Datei "client.py" führt einen ZeroMQ-Client aus. Der ZeroMQ-Client nimmt zwei Fließkommazahlen und die arithmetische Operation (Addition, Subtraktion, Multiplikation oder Division), die auf den Zahlen ausgeführt werden soll, als Eingabe vom Benutzer entgegen. Sobald die Eingabedaten vom Benutzer erfasst sind, kodiert das Client-Programm diese, sendet sie an den ZeroMQ-Server und wartet auf eine Antwort vom ZeroMQ-Server. Der ZeroMQ-Server erhält die Client-Daten, dekodiert sie, führt die arithmetische Operation auf den Fließkommazahlen aus und sendet das Ergebnis zurück an den ZeroMQ-Client. Das ZeroMQ-Client-Programm empfängt das Ergebnis und gibt es auf dem Bildschirm aus.

Erklärung des ZeroMQ-Servercodes

Zeile 1 importiert das ZeroMQ.

Zeile 3 erstellt einen ZeroMQ-Kontext.

Zeile 4 erstellt einen ZeroMQ-Antwortsocket, damit er auf die Anfragen des Clients reagieren kann.

Zeile 5 bindet den ZeroMQ-Socket an den TCP-Port 5000.

Die Zeilen 9-12 erstellen eine Funktion decode_client_data(). Diese Funktion nimmt die kodierten Client-Daten entgegen, dekodiert sie und gibt die Daten als eine Python-Liste zurück. Das erste Element der Liste ist die zu ausführende Operation (d.h. Addition, Subtraktion, Multiplikation, Division) an den zweiten und dritten Elementen. Die zweiten und dritten Elemente sind Gleitkommazahlen.

Die num_requests-Variable verfolgt lediglich, wie viele ZeroMQ-Clientanfragen der verarbeitete ZeroMQ-Server bearbeitet hat. Das ist nicht sehr wichtig.

Das Serverprogramm verwendet eine unendliche while-Schleife (Zeile 17), um weiterhin auf die ZeroMQ-Clientanfragen zu hören.

Zeile 21 verwendet die Funktion socket.recv(), um die Daten zu lesen, die vom ZeroMQ-Client gesendet werden.

Die try-except-Anweisung wird verwendet, um die KeyboardInterrupt-Ausnahme zu erkennen und schließt den ZeroMQ-Server-Socket, wenn die KeyboardInterrupt-Ausnahme auftritt. Wenn Sie + C drücken, während das Programm “server.py” läuft, sendet es eine KeyboardInterrupt-Ausnahme an das ZeroMQ-Programm, wodurch der ZeroMQ-Server-Socket geschlossen wird.

Zeile 27 decodiert die Daten, die vom ZeroMQ-Client gesendet werden.

Die dekodierten Daten werden in verschiedenen Variablen gespeichert, um das Programm leserlicher zu machen.

Je nach Option wird eine arithmetische Operation mit den Fließkommazahlen durchgeführt und das Ergebnis in einer Variablen gespeichert.

Zeile 47 druckt die Serverstatistiken, wie die Anzahl der bearbeiteten Anfragen, die Aktion und die Zahlen, die vom ZeroMQ-Client empfangen wurden, sowie das Ergebnis, das an den ZeroMQ-Client zurückgesendet wird.

In Zeile 49 wird socket.send() verwendet, um das Ergebnis an den ZeroMQ-Client zurückzusenden.

Erklärung des ZeroMQ-Client-Codes

Zeile 1 importiert das ZeroMQ.

Zeile 3 erstellt einen ZeroMQ-Kontext.

Zeile 4 erstellt einen ZeroMQ-Anforderungs-Socket, damit er die Anfragen an die ZeroMQ-Server senden kann.

Zeile 5 verbindet sich mit dem ZeroMQ-Server, der an TCP-Port 5000 läuft.

Die Zeilen 9-24 definieren die Funktion take_option_input(). Diese Funktion druckt die verfügbaren Aktionen aus, die der Benutzer ergreifen kann, und fordert den Benutzer auf, eine Option aus der Liste auszuwählen.

Die Zeilen 26-30 definieren die Funktion take_numbers_input(). Diese Funktion fordert den Nutzer lediglich auf, zwei Fließkommazahlen einzugeben und gibt die vom Benutzer eingegebenen Fließkommazahlen als Liste zurück.

Die Zeilen 32-35 definieren die Funktion encode_request_data(). Diese Funktion codiert die Option und zwei Fließkommazahlen, die der Benutzer eingegeben hat, in ein UTF-8-Byte-Array, damit das ZeroMQ-Clientprogramm sie auf einmal an den ZeroMQ-Server senden kann.

Zeile 37 führt eine unendliche While-Schleife aus, damit der ZeroMQ-Client den Benutzer weiterhin auffordern kann, Berechnungen durchzuführen oder das Client-Programm zu beenden, wenn der Benutzer keine Lust mehr hat, die Zahlen zu berechnen.

Zeile 40 überprüft, ob der Benutzer aufhören oder die falsche Option gewählt hat.

Der socket.close() in Zeile 41 wird verwendet, um den ZeroMQ-Client-Socket zu schließen, wenn der Benutzer eine falsche Option oder Option 5 (die Beendigung) auswählt.

Zeile 45 nimmt zwei Fließkommazahlen als Eingaben vom Benutzer entgegen.

Zeile 46 erstellt eine Liste der Optionen (arithmetische Operationen, die ausgeführt werden sollen) und der Gleitkommazahlen.

Zeile 47 kodiert die Kundendaten.

Zeile 49 verwendet socket.send(), um die codierten Clientdaten an den ZeroMQ-Server zu senden.

Sobald der ZeroMQ-Server eine Antwort sendet, verwendet Zeile 51 die Funktion socket.recv(), um sie zu lesen.

Zeile 51 gibt das empfangene Ergebnis auf der Konsole aus.

Testen der ZeroMQ Client-Server Taschenrechner-App

Um die ZeroMQ Client-Server Rechner-App zu testen, führen Sie zuerst das ZeroMQ Server-Programm "server.py" mit folgendem Befehl aus:

python3 server.py

Wie Sie sehen können, hat das ZeroMQ-Serverprogramm gestartet und ist bereit, auf die Anfragen der Clients zu reagieren.

Führen Sie dann das ZeroMQ-Client-Programm „client.py“ mit dem folgenden Befehl aus:

python3 client.py

Das ZeroMQ-Clientprogramm läuft. Das Clientprogramm druckt die verfügbaren Aktionen, die die Benutzer durchführen können, und wartet darauf, dass der Benutzer eine auswählt.

Lass uns mit der Additionsarithmetik beginnen.

Geben Sie 1 ein und drücken Sie <Enter>.

Geben Sie die erste Zahl ein und drücken Sie <Enter>.

Geben Sie die zweite Zahl ein und drücken Sie <Enter>.

Wie Sie sehen können, wird ein Ergebnis angezeigt.

Das ZeroMQ-Serverprogramm zeigt ebenfalls die korrekten Statistiken an.

In ähnlicher Weise können Sie die Zahlen mit dem ZeroMQ-Client- und Serverprogramm subtrahieren, multiplizieren und dividieren.

Der ZeroMQ-Server zeigt alle Statistiken/Anfragen an, die vom ZeroMQ-Client durchgeführt werden.

Um das ZeroMQ-Clientprogramm zu schließen, geben Sie 5 ein und drücken Sie <Enter>. Das ZeroMQ-Clientprogramm sollte geschlossen werden.

Um das ZeroMQ-Serverprogramm zu stoppen, drücken Sie <Ctrl> + C. Das ZeroMQ-Serverprogramm sollte beendet werden.

Fazit

Wir haben Ihnen gezeigt, wie Sie eine einfache Client-Server-Rechneranwendung mit der ZeroMQ-Python-Bibliothek schreiben. In diesem Artikel haben wir die folgenden ZeroMQ-Funktionen behandelt:

  • Einen ZeroMQ-Kontext erstellen
  • Erstellen eines ZeroMQ-Anforderungs-Sockets
  • Erstellen eines ZeroMQ-Antwortsockets
  • Ein ZeroMQ-Socket binden
  • Verbindung zu einem ZeroMQ-Antwortsocket herstellen
  • Verwendung der ZeroMQ recv() Funktion
  • Verwendung der ZeroMQ send() Funktion
  • Schließen eines ZeroMQ-Sockets