4D 20 R8 führte die Klasse TCPConnection ein, die einen objektorientierten, asynchronen Weg zur Handhabung von TCP-Client-Verbindungen bietet. Dann kam 4D 20 R9 mit der TCPListener-Klasse, um TCP-Server zu erstellen. Und jetzt, mit 4D 20 R10, vervollständigen wir das Bild mit der neuen Klasse UDPSocket, mit der Sie die UDP-Kommunikation zwischen 4D und einem beliebigen entfernten Rechner verwalten können, sowohl als Client als auch als Server. Dies ist besonders nützlich für IoT, Echtzeit-Überwachung oder Broadcasting-Austausch. Und das Tüpfelchen auf dem i? Diese Klasse unterstützt präemptive und asynchrone UDP-Kommunikation
Mit dieser neuen Funktion ist der letzte Schritt zur Ablösung des alten Internet Commands Plugins getan.
Lassen Sie uns in die Details eintauchen.
Warum UDP?
UDP ist ein leichtgewichtiges, verbindungsloses Protokoll. Im Gegensatz zu TCP unterhält es keine dauerhafte Verbindung zwischen den beiden Endpunkten. Es gibt keinen eingebauten Bestätigungs- oder Wiederholungsmechanismus, was es für „Senden und Vergessen“-Szenarien nützlich macht, die von Dritten auferlegt werden, wie IoT, Echtzeitüberwachung oder Broadcasting.
Mit der neuen UDPSocket Klasse haben Sie nun die volle Kontrolle über das Senden und Empfangen von UDP Paketen in 4D. Die unten dargestellten Prinzipien werden auch in dieser HDI beschrieben:
Definieren einer UDP-Client-Klasse
Hier ist eine einfache clientUDP-Klasse, die das Senden von Daten an einen UDP-Server übernimmt:
property socket : 4D.UDPSocket
property ip : Text
property port : Integer
Class constructor ($ip: Text; $port: Integer)
This .socket:=4D.UDPSocket.new(0; This)
This .ip:=$ip
This .port:=$port
//Send message to the UDP server
Function sendMessage ($message: Text)
var $blob : Blob
TEXT TO BLOB ($message; $blob; UTF8 text without length)
This .socket.send($blob; This.ip; This.port)
//Callback called when the socket is closed unexpectedly
Function onError ($socket: 4D.UDPSocket; $event: 4D.UDPEvent)
ALERT ("clientUDP instance error")
//Callback called after onShutdown/onError just before the UDPSocket object is released
Function onTerminate($socket : 4D.UDPSocket; $event : 4D.UDPEvent)
ALERT ("clientUDP instance termination")
In diesem Beispiel:
- Der Konstruktor legt die Ziel-IP und den Ziel-Port fest.
- Die switch-Funktion sendet eine einfache „switch“-Nachricht.
- onError und onTerminate behandeln Lebenszyklusereignisse.
- Es wird kein onData benötigt – UDP-Clients erhalten normalerweise keine Antworten.
Definieren einer UDP-Server-Klasse
Sehen wir uns nun eine serverUDP-Klasse an, die auf eingehende UDP-Nachrichten wartet:
property socket : 4D.UDPSocket
//The constructor creates a UDPSocket to listen to the port given in parameter
Class constructor ($port: Integer)
This .socket:=4D.UDPSocket.new($port; This)
//Callback called when receiving data
Function onData ($socket: 4D.UDPSocket; $event: 4D.UDPEvent)
var $data :=BLOB to text($event.data; UTF8 text without length)
ALERT ("serverUDP instance: Received message:\r\n "+$data)
//Callback called when the connection is closed unexpectedly
Function onError ($socket: 4D.UDPSocket; $event: 4D.UDPEvent)
ALERT ("serverUDP-Instanz: Fehler\r\n "+JSON Stringify($event.data; *))
//Callback called after onShutdown/onError just before the UDPSocket object is released
Function onTerminate ($socket: 4D.UDPSocket; $event: 4D.UDPEvent)
ALERT ("serverUDP-Instanz: Server beendet")
Hier:
- Der Server lauscht auf dem als Konstruktorparameter angegebenen Port.
- Der onData-Callback verarbeitet eingehende Nachrichten. Die Nachrichten werden in einer Instanz der neuen UDPEvent-Klasse gespeichert.
- Wie beim Client verwalten onError und onTerminate Lebenszyklusereignisse.
Ausführen des Servers in einem Worker
Um den Server unabhängig laufen zu lassen, müssen Sie ihn in einem Worker starten:
CALL WORKER("myServerUDP"; Formula(cs.serverUDP.new(12345)))
Hinweis: Der UDP-Socket wird automatisch freigegeben, wenn es keinen Verweis mehr auf das Objekt gibt. In diesem Fall wird der Server durch das Anhalten des Workers beendet.
Senden von Daten vom Client zum Server
Sobald beide Klassen vorhanden sind, ist das Senden einer Nachricht so einfach wie:
cs.clientUDP.new("127.0.0.1"; 12345).sendMessage("Testnachricht")
Die UDP-Kommunikation war in 4D noch nie so einfach. Mit der neuen Klasse UDPSocket können Sie jetzt leichtgewichtige Echtzeit-Kommunikationsfunktionen in Ihre Anwendungen einbauen – egal, ob Sie Befehle an ein Gerät senden oder auf Updates von einem entfernten System warten.
Wir hoffen, dass diese neue Funktion spannende Möglichkeiten für Ihre Projekte eröffnet.
Es ist an der Zeit, das Internet Commands Plugin loszuwerden!
Viel Spaß beim Programmieren!
