Neue Klasse zur Durchführung von TCP-Verbindungen

Mit der Veröffentlichung von 4D 20 R8 ist ein neues Feature hinzugekommen: die Klasse TCPConnection. Diese moderne Klasse nutzt die objektorientierte Syntax und unterstützt die Handhabung asynchroner Netzwerkverbindungen und bietet eine neue und leistungsstarke Alternative zu den 4D Internet Commands. Mit TCPConnection können Sie sich mit praktisch allem verbinden – ob mit Servern, Druckern, Registrierkassen oder industriellen Geräten – und damit ein vielseitiges Werkzeug für einzigartige Netzwerkanforderungen nutzen.

In dieser Version ist die TCP-Client-Funktionalität verfügbar, mit der Sie sich mit externen Servern verbinden und nahtlos Daten austauschen können.

HDI TCPConnections

Um das Potenzial von TCPConnection zu demonstrieren, führt dieser Beitrag Sie durch eine einfache Implementierung mit einer Singleton-Klasse, die die TCP-Kommunikation vereinfacht.

Tutorial mit einer einfachen Singleton-Klasse

Wir verwenden eine gemeinsam genutzte Singleton-Klasse namens „ConnectionToTheServer“, die eine Vereinfachung der im HDI verwendeten Klasse ist:

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")

Die Verwendung dieser Klasse ist sehr einfach. Zunächst stellt die connect-Funktion eine Verbindung zu einem Server her:

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

Die connect-Funktion instanziiert das TCPConnection-Objekt und stellt ebenfalls eine Verbindung zum Server her. Sie nimmt auch einen dritten Parameter entgegen, der ein Optionsobjekt ist. Dieses Objekt ist wichtig, da es alle Callbacks implementieren muss. In diesem Beispiel wird der Einfachheit halber das Singleton direkt verwendet, da es alle Callbacks implementiert.

Nach dem Aufruf von connect können die Daten entweder durch den Aufruf von sendText oder sendBlob an den Server gesendet werden:

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

TCPConnection sendet nur Datenblöcke. Um einen Text zu senden, muss er zunächst in einen Blob umgewandelt werden, wie bei der Funktion sendText.

Um Daten vom Server abzurufen, müssen Callbacks verwendet werden. Der erste Callback, der aufgerufen wird, ist onConnection. onConnection wird aufgerufen, wenn die Verbindung zum Server tatsächlich hergestellt wird. Es ist möglich, Daten zu senden, bevor onConnection aufgerufen wird. In diesem Fall werden die Daten aufbewahrt und gesendet, wenn die Verbindung hergestellt ist. Es ist sogar möglich, eine Verbindung herzustellen, Daten zu senden und die Verbindung zu beenden, ohne zu warten: In diesem Fall wird die Verbindung aufgebaut, die Daten werden gesendet und sobald alle Daten gesendet sind, wird die Verbindung geschlossen.

Ein weiterer wichtiger Callback ist onData: Er wird jedes Mal aufgerufen, wenn die TCPConnection Daten vom Server empfängt. Die empfangenen Daten stehen im Blob $event.data zur Verfügung, der so verwendet werden kann, wie er ist, oder mit dem Befehl BLOB to text in Text umgewandelt werden kann, wie in diesem Beispiel.

Und nicht zuletzt: Nach dem Verbinden, Senden und Empfangen ist der letzte wichtige Teil einer Verbindung das Schließen. Es gibt 3 Möglichkeiten, wie eine Verbindung geschlossen werden kann: Entweder schließt der Server die Verbindung, der Client schließt die Verbindung oder es tritt ein Verbindungsfehler auf und die Verbindung wird unterbrochen.

Wenn der Server die Verbindung schließt, wird der onShutdown-Callback aufgerufen.

Um die Verbindung auf der Client-Seite zu beenden, können Sie onShutdown aufrufen:

cs.ConnectionToTheServer.me.disconnect()

Ein Aufruf zum Trennen der Verbindung ruft auch den onShutdown-Callback auf (während die Verbindung geschlossen wird).

Und schließlich wird der onError-Callback aufgerufen, wenn ein Verbindungsfehler auftritt, der das Schließen der Verbindung erzwingt. Der onError-Callback wird auch aufgerufen, wenn die Verbindung zum Server fehlschlägt.

Schlussfolgerung

Wie Sie sehen können, ist die TCPConnection-Klasse unglaublich einfach zu benutzen und bietet gleichzeitig robuste Funktionalität. Ob Sie nun Daten senden oder empfangen, sie gewährleistet eine zuverlässige Kommunikation mit externen Geräten oder Servern.

Wenn Sie Fragen haben oder zusätzliche Unterstützung benötigen, können Sie sich gerne im 4D Forum melden.

Nicolas Brachfogel
Product Owner & Senior Developer - Nicolas Brachfogel kam 2017 als Senior Developer (4D Server und Netzwerke) zu 4D. Als Product Owner, der die Freigabe von Apple Silicon verwaltet, ist er für das Schreiben von User Stories und deren Umsetzung in funktionale Spezifikationen zuständig und stellt sicher, dass die Implementierungen der Funktionen den Kundenanforderungen entsprechen. Nicolas ist Absolvent des Institut Supérieur d'Informatique Appliquée (INSIA) und begann seine Karriere als Softwareentwickler im Jahr 2001. Nachdem er mehrere Jahre in Java und C++ programmiert hatte, spezialisierte er sich auf die Client-Server-Entwicklung für Videospielunternehmen. Als Server-Entwickler/Architekt arbeitete er erfolgreich an den Server-Architekturen vieler Spiele (Dofus Arena, Drakerz, Trivial Pursuit Go!).