Nuova classe per eseguire comunicazioni UDP

Tradotto automaticamente da Deepl

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:

HDI UDPSocket

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!

Avatar
- Product Owner -Damien Fuzeau è entrato a far parte del team 4D Product nel febbraio 2019. In qualità di Product Owner, si occupa di scrivere le storie degli utenti e di tradurle in specifiche funzionali. Il suo lavoro consiste anche nell'assicurarsi che le implementazioni delle funzionalità fornite soddisfino le esigenze dei clienti.Damien si è laureato all'Università di Nantes in ingegneria del software. Ha trascorso più di 23 anni nella sua precedente azienda, prima come sviluppatore (scoprendo 4D nel 1997), poi come responsabile dell'ingegneria e architetto software. Questa azienda è un partner OEM di 4D e ha distribuito software aziendali basati su 4D per migliaia di utenti, su centinaia di server. Damien è quindi abituato allo sviluppo e alla distribuzione di 4D in un contesto multilingue.