Nuova classe per eseguire connessioni TCP

Tradotto automaticamente da Deepl

Con il rilascio di 4D 20 R8, è arrivata una caratteristica che ha cambiato le carte in tavola: la classe TCPConnection. Questa moderna classe sfrutta la sintassi orientata agli oggetti e supporta la gestione delle connessioni di rete asincrone, offrendo una nuova e potente alternativa ai comandi Internet di 4D. Utilizzando TCPConnection, è possibile connettersi praticamente a qualsiasi cosa, che si tratti di server, stampanti, registratori di cassa o dispositivi industriali, rendendolo uno strumento versatile per gestire requisiti di rete unici.

In questa versione è disponibile la funzionalità client TCP, che consente di connettersi a server esterni e di scambiare dati senza problemi.

HDI TCPConnections

Per dimostrare il potenziale di TCPConnection, questo post vi guiderà attraverso una semplice implementazione utilizzando una classe singleton che semplifica la comunicazione TCP.

Esercitazione con una semplice classe singleton

Utilizziamo una classe singleton condivisa chiamata “ConnectionToTheServer”, che è una semplificazione della classe utilizzata nell’HDI:

Shared Singleton Class constructor()

//Connect to a server
Function connect($address : Text; $port : Integer)

    This.connection:=4D.TCPConnection.new($address; $port; This)

//Disconnect from the server
Function disconnect()

    This.connection.shutdown()
    This.connection:=Null

//Send a text to the server
Function sendText($text : Text)

    var $blob : Blob
    TEXT TO BLOB($text; $blob; UTF8 text without length)
    This.sendBlob($blob)

//Send a blob to the server
Function sendBlob($blob : Blob)

    This.connection.send($blob)

//Callback called when the connection is successfully established
Function onConnection($connection : 4D.TCPConnection; $event : 4D.TCPEvent)

    ALERT("Connection established")

//Callback called when the connection is properly closed
Function onShutdown($connection : 4D.TCPConnection; $event : 4D.TCPEvent)

    ALERT("Connection closed")

//Callback called when receiving data. The simple servers always send a sentence to show to the user
Function onData($connection : 4D.TCPConnection; $event : 4D.TCPEvent)

    ALERT(BLOB to text($event.data; UTF8 text without length))

//Callback called when the connection is closed unexpectedly
Function onError($connection : 4D.TCPConnection; $event : 4D.TCPEvent)

    ALERT("Connection error")

L’uso di questa classe è molto semplice. Innanzitutto, la funzione connect si connette a un server:

cs.ConnectionToTheServer.me.connect("server IP address or domain name";1234/*server port*/)

La funzione connect istanzia l’oggetto TCPConnection e si connette al server. Prende anche un terzo parametro, che è un oggetto option. Questo oggetto è importante perché deve implementare tutti i callback. In questo esempio, per semplicità, viene utilizzato direttamente il singleton, che implementa tutti i callback.

Una volta chiamato connect, i dati possono essere inviati al server chiamando sendText o sendBlob:

cs.ConnectionToTheServer.me.sendText("The text to send to the server")

TCPConnection invia solo blob di dati. Per inviare un testo, occorre prima convertirlo in un blob, come nella funzione sendText.

Per recuperare i dati dal server, è necessario utilizzare delle callback. Il primo callback chiamato è onConnection. onConnection viene chiamato quando viene stabilita la connessione al server. È possibile inviare i dati prima che onConnection venga chiamato, in questo caso i dati vengono conservati e inviati quando la connessione viene stabilita. È anche possibile connettersi, inviare dati e chiudere senza aspettare: In questo caso, la connessione sarà stabilita, i dati saranno inviati e una volta inviati tutti i dati la connessione sarà chiusa.

Un altro callback importante è onData: Viene chiamata ogni volta che la TCPConnection riceve dati dal server. I dati ricevuti sono accessibili nel blob $event.data, che può essere utilizzato così com’è o trasformato in testo con il comando BLOB to text come nell’esempio.

Ultimo ma non meno importante: Dopo la connessione, l’invio e la ricezione, l’ultima parte importante di una connessione è la chiusura. Esistono tre modi per chiudere una connessione: Il server chiude la connessione, il client chiude la connessione o si verifica un errore di connessione e si viene disconnessi.

Quando il server chiude la connessione, viene richiamato il callback onShutdown.

Per chiudere la connessione sul lato client, si può chiamare:

cs.ConnectionToTheServer.me.disconnect()

Una chiamata alla disconnessione richiama anche il callback onShutdown (mentre la connessione viene chiusa).

Infine, se si verifica un errore di connessione che costringe a chiudere la connessione, viene richiamato il callback onError. Il callback onError viene richiamato anche se la connessione al server fallisce.

Conclusione

Come si può vedere, la classe TCPConnection è incredibilmente facile da usare, pur fornendo solide funzionalità. Che si tratti di inviare o ricevere dati, garantisce una comunicazione affidabile con dispositivi o server esterni.

Se avete domande o bisogno di ulteriore supporto, non esitate a contattarci sul forum 4D.

Nicolas Brachfogel
- Proprietario del prodotto e sviluppatore senior - Nicolas Brachfogel è entrato in 4D nel 2017 come Senior Developer (4D Server e networking). In qualità di Product Owner per gestire il rilascio di Apple Silicon, si occupa di scrivere le storie degli utenti e di tradurle in specifiche funzionali, nonché di assicurarsi che le implementazioni delle funzionalità soddisfino le esigenze dei clienti. Diplomato all'Institut Supérieur d'Informatique Appliquée (INSIA), Nicolas ha iniziato la sua carriera come sviluppatore di software nel 2001. Dopo diversi anni di codifica in Java e C++, si è specializzato nello sviluppo di client-server per aziende di videogiochi. Come sviluppatore/architetto di server, ha lavorato con successo alle architetture server di molti giochi (Dofus Arena, Drakerz, Trivial Pursuit Go!).