Nouvelle classe pour gérer des connexions TCP

Avec la sortie de 4D 20 R8, une fonctionnalité qui change la donne est arrivée : la classe TCPConnection. Cette classe moderne tire parti de la syntaxe orientée objet et prend en charge la gestion des connexions de manière asynchrone, offrant ainsi une alternative nouvelle et puissante aux 4D Internet Commands. En utilisant TCPConnection, vous pouvez vous connecter à pratiquement tout, qu’il s’agisse de serveurs, d’imprimantes, de caisses enregistreuses ou d’appareils industriels, ce qui en fait un outil polyvalent pour répondre à des besoins uniques.

Dans cette version, la fonctionnalité client est disponible, ce qui vous permet de vous connecter à des serveurs externes et d’échanger des données de façon transparente.

HDI TCPConnections

Pour démontrer le potentiel de TCPConnection, ce blog post vous guidera à travers une implémentation simple utilisant un singleton.

Tutoriel avec une simple classe singleton

Utilisons un shared singleton appelé « ConnectionToTheServer », qui est une simplification de la classe utilisée dans l’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’utilisation de cette classe est très simple. Tout d’abord, la fonction connect se connecte à un serveur :

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

La fonction connect instancie l’objet TCPConnection et se connecte également au serveur. Elle prend également un troisième paramètre qui est un objet option. Cet objet est important car il doit implémenter tous les callbacks. Dans cet exemple, et par souci de simplicité, le singleton est utilisé directement car il implémente tous les callbacks.

Une fois la connexion appelée, les données peuvent être envoyées au serveur en appelant sendText ou sendBlob :

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

TCPConnection n’envoie que des blobs de données. Pour envoyer un texte, il faut d’abord le convertir en blob, comme dans la fonction sendText.

Pour récupérer des données du serveur, des callbacks doivent être utilisés. Le premier callback appelé est onConnection. onConnection est appelé lorsque la connexion est effectivement établie avec le serveur. Il est possible d’envoyer des données avant que onConnection ne soit appelé, auquel cas les données sont conservées et envoyées lorsque la connexion est établie. Il est même possible de se connecter, d’envoyer des données et de fermer sans attendre : Dans ce cas, la connexion sera établie, les données seront envoyées et une fois toutes les données envoyées, la connexion sera fermée.

Un autre callback important est onData : Il est appelé à chaque fois que la TCPConnection reçoit des données du serveur. Les données reçues sont accessibles dans le blob $event.data, qui peut être utilisé tel quel ou transformé en texte avec la commande BLOB to text comme dans l’exemple.

Dernier point, mais non des moindres : Après la connexion, l’envoi et la réception, la dernière partie importante d’une connexion est la fermeture. Il y a trois façons de fermer une connexion : Soit le serveur ferme la connexion, soit le client ferme la connexion, soit une erreur de connexion se produit et vous êtes déconnecté.

Lorsque le serveur ferme la connexion, le callback onShutdown est appelé.

Pour fermer la connexion du côté client, vous pouvez appeler disconnect:

cs.ConnectionToTheServer.me.disconnect()

Cela appellera également le callback onShutdown (lors de la fermeture de la connexion).

Enfin, si une erreur de connexion survient et force la fermeture de la connexion, le callback onError est appelé. Le callback onError est également appelé si la connexion au serveur échoue.

Conclusion

Comme vous pouvez le constater, la classe TCPConnection est extrêmement facile à utiliser tout en offrant des fonctionnalités robustes. Qu’il s’agisse d’envoyer ou de recevoir des données, elle garantit une communication fiable avec des périphériques ou des serveurs externes.

Si vous avez des questions ou si vous avez besoin d’une assistance supplémentaire, n’hésitez pas à nous contacter sur le forum 4D.

Nicolas Brachfogel
- Product Owner & Senior Developer - Nicolas Brachfogel a rejoint 4D en 2017 en tant que développeur senior (4D Server et networking) et en tant que Product Owner pour gérer la mise en production d'Apple Silicon. Il est chargé de rédiger les user stories et de les traduire en spécifications fonctionnelles, ainsi que de s'assurer que les implémentations des fonctionnalités répondent aux besoins des clients. Diplômé de l'Institut Supérieur d'Informatique Appliquée (INSIA), Nicolas a commencé sa carrière en tant que développeur de logiciels en 2001. Après plusieurs années de programmation en Java et C++, il s'est spécialisé dans le développement client-serveur pour des sociétés de jeux vidéo. En tant que développeur/architecte serveur, il a travaillé avec succès sur les architectures serveur de nombreux jeux (Dofus Arena, Drakerz, Trivial Pursuit Go !).