Nova classe para efetuar ligações TCP

Com o lançamento de 4D 20 R8, uma caraterística que muda o jogo chegou:: a classe TCPConnection. Essa classe moderna aproveita a sintaxe orientada a objetos e suporta o manuseio de conexão de rede assíncrona, oferecendo uma alternativa nova e poderosa aos Comandos de Internet 4D. Usando TCPConnection, pode conectar-se virtualmente a qualquer coisa – quer sejam servidores, impressoras, caixas registadoras ou dispositivos industriais – tornando-a uma ferramenta versátil para lidar com requisitos de rede únicos.

Nesta versão, a funcionalidade de cliente TCP está disponível, permitindo-lhe ligar-se a servidores externos e trocar dados sem problemas.

HDI TCPConnections

Para demonstrar o potencial do TCPConnection, este post irá guiá-lo através de uma implementação simples usando uma classe singleton que simplifica a comunicação TCP.

Tutorial com uma classe singleton simples

Vamos utilizar uma classe singleton partilhada chamada “ConnectionToTheServer”, que é uma simplificação da classe utilizada no HDI:

Shared Singleton Class constructor()

//Conecte a um servidor
Function connect($address : Text; $port : Integer)

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

//Desconecte do servidor
Function disconnect()

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

//Envie um texto ao servidor
Function sendText($text : Text)

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

//Envie um blob a um servidor
Function sendBlob($blob : Blob)

    This.connection.send($blob)

//Chamada de Callback quando a conexão tiver sido estabelecida
Function onConnection($connection : 4D.TCPConnection; $event : 4D.TCPEvent)

    ALERT("Connection established")

//Chamada de Callback quando a conexão for fechada
Function onShutdown($connection : 4D.TCPConnection; $event : 4D.TCPEvent)

    ALERT("Connection closed")

//Chamada de Callback quando receber dados. Os servidores simples sempre mandam uma sentença para mostrar ao usuário
Function onData($connection : 4D.TCPConnection; $event : 4D.TCPEvent)

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

//Chamada de Callback quando a conexão terminar de forma inesperada
Function onError($connection : 4D.TCPConnection; $event : 4D.TCPEvent)

    ALERT("Connection error")

A utilização desta classe é muito simples. Em primeiro lugar, a função de ligação estabelece a ligação a um servidor:

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

A função connect instancia o objeto TCPConnection e também se liga ao servidor. Também recebe um terceiro parâmetro que é um objeto de opção. Este objeto é importante porque tem de implementar todas as chamadas de retorno. Neste exemplo, e por uma questão de simplicidade, o singleton é utilizado diretamente, uma vez que implementa todas as chamadas de retorno.

Uma vez chamada a ligação, os dados podem ser enviados para o servidor chamando sendText ou sendBlob:

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

O TCPConnection só envia blobs de dados. Para enviar um texto, este tem primeiro de ser convertido numa bolha, como na função sendText.

Para obter dados do servidor, é necessário utilizar as chamadas de retorno. A primeira chamada de retorno chamada é onConnection. onConnection é chamada quando a ligação é efetivamente estabelecida com o servidor. É possível enviar dados antes de onConnection ser chamada, nesse caso os dados são guardados e enviados quando a ligação é estabelecida. É ainda possível estabelecer uma ligação, enviar dados e encerrar sem esperar: Nesse caso, a ligação será estabelecida, os dados serão enviados e, assim que todos os dados forem enviados, a ligação será encerrada.

Outra chamada de retorno importante é onData: É chamada sempre que a TCPConnection recebe dados do servidor. Os dados recebidos ficam acessíveis no blob $event.data, que pode ser usado como está ou transformado em texto com o comando BLOB to text, como no exemplo.

Por último, mas não menos importante: Depois de conectar, enviar e receber, a última parte importante de uma conexão é o encerramento. Existem 3 maneiras de uma conexão ser terminada: Ou o servidor termina a conexão, o cliente termina a conexão ou ocorre um erro de conexão e você é desconectado.

Quando o servidor encerra a conexão, a chamada de retorno onShutdown é chamada.

Para encerrar a ligação no lado do cliente, pode chamar:

cs.ConnectionToTheServer.me.disconnect()

Uma chamada para desconectar também chamará a chamada de retorno onShutdown (já que a conexão está sendo fechada).

E, finalmente, se ocorrer um erro de ligação que obrigue a ligação a terminar, é chamada a chamada de retorno onError. A chamada de retorno onError também é chamada se a conexão com o servidor falhar.

Conclusão

Como você pode ver, a classe TCPConnection é incrivelmente fácil de usar e oferece uma funcionalidade robusta. Quer esteja a enviar ou a receber dados, ela garante uma comunicação fiável com dispositivos ou servidores externos.

Se tiver perguntas ou precisar de suporte adicional, sinta-se à vontade para entrar em contato no fórum 4D.

Nicolas Brachfogel
• Proprietário do produto e Desenvolvedor Senior -Nicolas Brachfogel entrou a 4D em 2017 como Senior Developer (4D Server e Networking). Como Product Owner para gerenciar o lançamento de Apple Silicon, está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais, além de garantir que as implementações de funcionalidade cumpram com as necessidades do cliente. Diplomado pelo Instituto Superior de Informática Aplicada (INSIA), Nicolas começou sua carreira como desenvolvedor de software em 2001. Depois de vários anos codificando em Java e C++, passou a especializar-se no desenvolvimento cliente-servidor para empresas de videogames. Como desenvolvedor/arquiteto de servidores, trabalhou com sucesso nas arquiteturas de servidores de muitos jogos (Dofus Arena, Drakerz, Trivial Pursuit Go!)