4D 20 R8 zavedl třídu TCPConnection, která přináší objektově orientovaný, asynchronní způsob zpracování klientských připojení TCP. Poté přišla verze 4D 20 R9 s třídou TCPListener pro vytváření TCP serverů. A nyní, v 4D 20 R10, doplňujeme obraz o novou třídu UDPSocket, která umožňuje spravovat komunikaci UDP mezi 4D a libovolným vzdáleným počítačem, a to jak v roli klienta, tak v roli serveru. To je užitečné zejména pro IoT, monitorování v reálném čase nebo vysílání výměn. A třešnička na dortu? Tato třída podporuje preemptivní a asynchronní komunikaci UDP
Konečně tato nová funkce znamená poslední krok v nahrazení staršího pluginu Internet Commands.
Pojďme se ponořit do podrobností.
Proč UDP?
UDP je lehký protokol bez spojení. Na rozdíl od protokolu TCP neudržuje trvalé spojení mezi dvěma koncovými body. Neexistuje žádný vestavěný mechanismus potvrzování nebo opakovaného přenosu, což jej činí užitečným pro scénáře „odeslat a zapomenout“ vynucené třetími stranami, jako je IoT, monitorování v reálném čase nebo vysílání.
Díky nové třídě UDPSocket máte nyní v prostředí 4D plnou kontrolu nad odesíláním i přijímáním paketů UDP. Níže uvedené principy jsou popsány také v tomto HDI:
Definice třídy klienta UDP
Zde je jednoduchá třída clientUDP, která se stará o odesílání dat na UDP server:
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 ("chyba instance clientUDP")
//Callback called after onShutdown/onError just before the UDPSocket object is released
Function onTerminate($socket : 4D.UDPSocket; $event : 4D.UDPEvent)
ALERT ("ukončení instance clientUDP").
V tomto příkladu:
- Konstruktor nastavuje cílovou IP adresu a port.
- Funkce switch odešle jednoduchou zprávu „switch“.
- Funkce onError a onTerminate zpracovávají události životního cyklu.
- Není potřeba žádné onData – klientiUDP obvykle nedostávají odpovědi.
Definice třídy serveru UDP
Nyní se podíváme na třídu serverUDP, která naslouchá příchozím zprávám UDP:
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 ("instance serverUDP: Received message:\r\n "+$data)
//Callback called when the connection is closed unexpectedly
Function onError ($socket: 4D.UDPSocket; $event: 4D.UDPEvent)
ALERT ("instance serverUDP: error\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 ("instance serverUDP: Ukončení serveru")
Zde:
- Server naslouchá na portu zadaném jako parametr konstruktoru.
- Zpětné volání onData zpracovává příchozí zprávy. Zprávy jsou uloženy v instanci nové třídy UDPEvent.
- Stejně jako u klienta, i zde se události životního cyklu spravují pomocí onError a onTerminate.
Spuštění serveru v pracovní jednotce
Aby server běžel nezávisle, je třeba jej spustit v pracovním serveru:
CALL WORKER("myServerUDP"; Formula(cs.serverUDP.new(12345)))
Poznámka: Zásuvka UDP se automaticky uvolní, jakmile na objekt již není žádný odkaz. V tomto případě zastavení workeru ukončí server.
Odesílání dat z klienta na server
Jakmile jsou obě třídy zavedeny, je odeslání zprávy tak jednoduché, jako např:
cs.clientUDP.new("127.0.0.1"; 12345).sendMessage("Testovací zpráva")
Komunikace UDP nebyla ve 4D nikdy jednodušší. Díky nové třídě UDPSocket můžete nyní do svých aplikací zabudovat lehké funkce pro komunikaci v reálném čase – ať už posíláte příkazy do zařízení, nebo posloucháte aktualizace ze vzdáleného systému.
Doufáme, že vám tato nová funkce otevře zajímavé možnosti pro vaše projekty.
Je čas zbavit se zásuvného modulu Internet Commands!
Šťastné programování!
K tomuto příspěvku zatím nelze přidávat komentáře.