Nueva clase para realizar conexiones TCP

Con el lanzamiento de 4D 20 R8, ha llegado una funcionalidad que cambia el juego: la clase TCPConnection. Esta moderna clase aprovecha la sintaxis orientada a objetos y soporta el manejo de conexiones de red asíncronas, ofreciendo una alternativa fresca y poderosa a 4D Internet Commands. Utilizando TCPConnection, puede conectarse prácticamente a todo, bien sean servidores, impresoras, cajas registradoras o dispositivos industriales, haciéndolo una herramienta versátil para manejar requerimientos únicos de red.

En esta versión, la funcionalidad cliente TCP está disponible, lo que le permite conectarse a servidores externos e intercambiar datos sin problemas.

HDI TCPConnections

Para demostrar el potencial de TCPConnection, este post le guiará a través de una implementación simple utilizando una clase singleton que simplifica la comunicación TCP.

Tutorial con una clase singleton simple

Vamos a utilizar una clase singleton compartida llamada «ConnectionToTheServer», que es una simplificación de la clase utilizada en el IDH:

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

Utilizar esta clase es muy sencillo. En primer lugar, la función connect se conecta a un servidor:

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

La función connect instancia el objeto TCPConnection y también se conecta al servidor. También toma un tercer parámetro que es un objeto option. Este objeto es importante ya que tiene que implementar todas las retrollamadas. En este ejemplo, y en aras de la simplicidad, el singleton se utiliza directamente, ya que implementa todas las retrollamadas.

Una vez que connect ha sido llamado, los datos pueden ser enviados al servidor llamando a sendText o sendBlob:

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

TCPConnection sólo envía blobs de datos. Para enviar un texto, primero hay que convertirlo en un blob como en la función sendText.

Para recuperar datos del servidor, hay que utilizar retrollamadas. La primera retrollamada es onConnection. onConnection es llamada cuando se establece la conexión con el servidor. Es posible enviar datos antes de que onConnection sea llamado, en ese caso los datos son guardados y enviados cuando la conexión es establecida. Incluso es posible conectarse, enviar datos y cerrar sin esperar: en ese caso se establecerá la conexión, se enviarán los datos y una vez enviados todos se cerrará la conexión.

Otra llamada de retorno importante es onData: se llama cada vez que la TCPConnection recibe datos del servidor. Los datos recibidos son accesibles en el blob $event.data, que puede ser usado tal cual o convertido en texto con el comando BLOB to text como en el ejemplo.

Por último, pero no menos importante: después de conectar, enviar y recibir, la última parte importante de una conexión es el cierre. Hay 3 formas de cerrar una conexión: el servidor cierra la conexión, el cliente cierra la conexión o se produce un error de conexión y se desconecta.

Cuando el servidor cierra la conexión, se llama la retrollamada onShutdown.

Para cerrar la conexión del lado del cliente, puede llamar a:

cs.ConnectionToTheServer.me.disconnect()

Una llamada a desconectar también llamará a la retrollamada onShutdown (mientras se cierra la conexión).

Por último, si se produce un error de conexión que obliga a cerrar la conexión, se llama a la retrollamada onError. La retrollamada onError también es llamada si la conexión con el servidor falla.

Conclusión

Como puede ver, la clase TCPConnection es increíblemente fácil de usar a la vez que ofrece una funcionalidad robusta. Ya sea que esté enviando o recibiendo datos, asegura una comunicación confiable con dispositivos externos o servidores.

Si tiene preguntas o necesita soporte adicional, no dude en contactarnos en el foro de 4D.

Nicolas Brachfogel
• Propietario de producto y Desarrollador Senior - Nicolas Brachfogel se unió a 4D en 2017 como Senior Developer (4D Server y networking). Como Product Owner para gestionar el lanzamiento de Apple Silicon, está a cargo de escribir historias de usuario y traducirlas en especificaciones funcionales, así como asegurarse de que las implementaciones de las funcionalidades satisfagan las necesidades del cliente. Diplomado por el Instituto Superior de Informática Aplicada (INSIA), Nicolas comenzó su carrera como desarrollador de software en 2001. Tras varios años codificando en Java y C++, pasó a especializarse en el desarrollo cliente-servidor para empresas de videojuegos. Como desarrollador/arquitecto de servidores, trabajó con éxito en las arquitecturas de servidores de muchos juegos (Dofus Arena, Drakerz, Trivial Pursuit Go!).