4D 20 R8 ha introdotto la classe TCPConnection, che offre un modo asincrono e orientato agli oggetti per gestire le connessioni client TCP. Poi è arrivata 4D 20 R9 con la classe TCPListener per costruire server TCP. E ora, con 4D 20 R10, completiamo il quadro con la nuova classe UDPSocket, che consente di gestire le comunicazioni UDP tra 4D e qualsiasi macchina remota, sia come client che come server. Ciò è particolarmente utile per l’IoT, il monitoraggio in tempo reale o gli scambi di broadcasting. E la ciliegina sulla torta? Questa classe supporta le comunicazioni UDP preemptive e asincrone.
Infine, questa nuova funzionalità segna il passo finale nella sostituzione del plugin Internet Commands.
Entriamo nei dettagli.
Perché UDP?
UDP è un protocollo leggero e senza connessioni. A differenza del TCP, non mantiene una connessione persistente tra i due endpoint. Non esiste un meccanismo di riconoscimento o di ritrasmissione integrato, che lo rende utile per gli scenari “invia e dimentica” imposti da terze parti, come l’IoT, il monitoraggio in tempo reale o il broadcasting.
Con la nuova classe UDPSocket, ora si ha il pieno controllo sull’invio e sulla ricezione dei pacchetti UDP in 4D. I principi presentati di seguito sono descritti anche in questa HDI:
Definizione di una classe client UDP
Ecco una semplice classe clientUDP che gestisce l’invio di dati a un server UDP:
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 questo esempio:
- Il costruttore imposta l’IP e la porta di destinazione.
- La funzione switch invia un semplice messaggio “switch”.
- onError e onTerminate gestiscono gli eventi del ciclo di vita.
- Non è necessario onData: i clientUDP in genere non ricevono risposte.
Definizione di una classe server UDP
Vediamo ora una classe serverUDP che ascolta i messaggi UDP in arrivo:
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 ("istanza serverUDP: errore\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 ("istanza serverUDP: terminazione server")
Qui:
- Il server è in ascolto sulla porta indicata come parametro del costruttore.
- Il callback onData gestisce i messaggi in arrivo. I messaggi sono memorizzati in un’istanza della nuova classe UDPEvent.
- Come per il client, onError e onTerminate gestiscono gli eventi del ciclo di vita.
Esecuzione del server in un worker
Per mantenere il server in esecuzione in modo indipendente, è necessario lanciarlo in un worker:
CALL WORKER("myServerUDP"; Formula(cs.serverUDP.new(12345))
Nota: il socket UDP viene rilasciato automaticamente quando non ci sono più riferimenti all’oggetto. In questo caso, l’arresto del worker terminerà il server.
Invio di dati dal client al server
Una volta che entrambe le classi sono a posto, l’invio di un messaggio è semplice come:
cs.clientUDP.new("127.0.0.1"; 12345).sendMessage("Messaggio di prova")
La comunicazione UDP non è mai stata così semplice in 4D. Con la nuova classe UDPSocket, è ora possibile integrare nelle applicazioni funzioni di comunicazione leggere e in tempo reale, sia che si tratti di inviare comandi a un dispositivo sia di ascoltare gli aggiornamenti da un sistema remoto.
Ci auguriamo che questa nuova funzione apra interessanti possibilità per i vostri progetti.
È ora di liberarsi del plugin Internet Commands!
Buona codifica!
Al momento non è possibile lasciare commenti su questo post.