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.
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.