TCPConnection
La clase TCPConnection
permite gestionar conexiones cliente del Protocolo de Control de Transmisión (TCP) a un servidor, permitiendo enviar y recibir datos, y manejar eventos del ciclo de vida de la conexión mediante retrollamadas.
La clase TCPConnection
está disponible en el class store 4D
. Puede crear una conexión TCP utilizando la función 4D.TCPConnection.new() que devuelve un TCPConnection object.
Todas las funciones de la clase TCPConnection
son hilo seguro.
Gracias al refcounting estándar de los objetos 4D, una TCPConnection se libera automáticamente cuando deja de estar referenciada. En consecuencia, los recursos asociados, se limpian adecuadamente sin necesidad de un cierre explícito.
Los objetos TCPConnection se liberan cuando ya no existen referencias a ellos en memoria. Esto ocurre típicamente, por ejemplo, al final de una ejecución de un método para variables locales. If you want to "force" the closure of a connection at any moment, nullify its references by setting them to Null.
Historia
Lanzamiento | Modificaciones |
---|---|
20 R9 | Nuevos atributos listener , address y port |
20 R8 | Clase añadida |
Ejemplos
Los siguientes ejemplos demuestran cómo utilizar las clases 4D.TCPConnection y 4D.TCPEvent para gestionar una conexión cliente TCP, manejar eventos, enviar datos y cerrar correctamente la conexión. Se ofrecen ejemplos tanto síncronos como asíncronos.
Ejemplo sincrónico
Este ejemplo muestra cómo establecer una conexión, enviar datos y cerrarla utilizando un simple objeto para la configuración:
var $domain : Text := "127.0.0.1"
var $port : Integer := 10000
var $options : Object := New object() // Objeto de configuración
var $tcpClient : 4D.TCPConnection
var $message : Text := "test message"
// Abrir una conexión
$tcpClient := 4D.TCPConnection.new($domain; $port; $options)
// Enviar datos
var $blobData : Blob
TEXT TO BLOB($message; $blobData; UTF8 text without length)
$tcpClient.send($blobData)
// Apagar
$tcpClient.shutdown()
$tcpClient.wait(0)
Ejemplo asincrónico
Este ejemplo define una clase que maneja el ciclo de vida de la conexión y los eventos, mostrando cómo trabajar de forma asíncrona:
// Definición de la clase: cs.MyAsyncTCPConnection
Class constructor($url : Text; $port : Integer)
This.connection := Null
This.url := $url
This.port := $port
// Conectarse a uno de los servidores lanzados dentro de los workers
Function connect()
This.connection := 4D.TCPConnection.new(This.url; This.port; This)
// Desconectarse del servidor
Function disconnect()
This.connection.shutdown()
This.connection := Null
// Enviar datos al servidor
Function getInfo()
var $blob : Blob
TEXT TO BLOB("Información"; $blob)
This.connection.send($blob)
// Retrollamada cuando la conexión se ha establecido correctamente
Function onConnection($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT("Conexión establecida")
// Retrollamada cuando la conexión se ha cerrado correctamente
Function onShutdown($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT("Conexión cerrada")
// Retrollamada cuando se reciben datos del servidor
Function onData($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT(BLOB to text($event.data; UTF8 text without length))
//Atención: no hay garantía de que reciba todos los datos que necesita en un solo paquete de red.
// Retrollamada cuando la conexión se cierra inesperadamente
Function onError($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT("Error de conexión")
// Retrollamada después de onShutdown/onError justo antes de que el objeto TCPConnection sea liberado
Function onTerminate($connection : 4D.TCPConnection; $event : 4D.TCPEvent)
ALERT("Conexión terminada")
Ejemplo de uso
Crea un nuevo método llamado AsyncTCP, para inicializar y gestionar la conexión TCP:
var $myObject : cs.MyAsyncTCPConnection
$myObject := cs.MyAsyncTCPConnection.new("myURL"; 10000)
$myObject.connect()
$myObject.getInfo()
$myObject.disconnect()
Llama al método AsyncTCP en un worker:
CALL WORKER("new process"; "Async_TCP")
Objeto TCPConnection
Un objeto TCPConnection es un objeto no compartible.
Los objetos TCPConnection ofrecen las siguientes propiedades y funciones:
address : Text la dirección IP o el nombre de dominio de la máquina remota |
closed : Boolean si la conexión está cerrada |
errors : Collection una colección de objetos de error asociados a la conexión |
listener : Object el objeto TCPListener que creó la TCPConnection , si existe |
noDelay : Boolean si el algoritmo de Nagle está desactivado ( true ) o activado (false ) |
port : Number el número de puerto de la máquina remota |
.send( data : Blob ) envía datos al servidor |
.shutdown() cierra el canal write de la conexión (cliente a servidor) |
.wait( { timeout : Real } ) espera hasta que se cierre la conexión TCP o se alcance el timeout especificado |
4D.TCPConnection.new()
4D.TCPConnection.new( serverAddress : Text ; serverPort : Number ; options : Object ) : 4D.TCPConnection
Parámetros | Tipo | Descripción | |
---|---|---|---|
serverAddress | Text | -> | Nombre de dominio o dirección IP del servidor |
serverPort | Integer | -> | Número de puerto del servidor |
options | Object | -> | Configuración opciones para la conexión |
Resultado | TCPConnection | <- | Nuevo objeto TCPConnection |
Descripción
La función 4D.TCPConnection.new()
crea una nueva conexión TCP a la serverAddress y serverPort especificados, usando las opciones definidas, y devuelve un objeto 4D.HTTPRequest
.
Parámetro options
En el parámetro options, pase un objeto que puede contener las siguientes propiedades:
Propiedad | Tipo | Descripción | Por defecto |
---|---|---|---|
onConnection | Formula | Retrollamada que se activa cuando se establece la conexión. | Indefinido |
onData | Formula | Retrollamada activada cuando se reciben datos | Indefinido |
onShutdown | Formula | Retrollamada activada cuando la conexión se cierra correctamente | Indefinido |
onError | Formula | Retrollamada en caso de error | Indefinido |
onTerminate | Formula | Retrollamada activada justo antes de que se libere la TCPConnection | Indefinido |
noDelay | Boolean | Sólo lectura cesactiva el algoritmo de Nagle si true | False |
Función callback (retrollamada)
Todas las funciones de retrollamada reciben dos parámetros:
Parámetros | Tipo | Descripción |
---|---|---|
$connection | objeto TCPConnection | La instancia de conexión TCP actual. |
$event | objeto TCPEvent | Contiene información sobre el evento. |
Secuencia de retrollamadas:
onConnection
se activa cuando se establece la conexión.onData
se activa cada vez que se reciben datos.- Se activa
onShutdown
oonError
:onShutdown
se activa cuando la conexión se cierra correctamente.onError
se activa si se produce un error.
onTerminate
siempre se activa justo antes de que la TCPConnection se libere (la conexión se cierra o se produce un error).
Objeto TCPEvent
Un objeto TCPEvent
es devuelto cuando se llama una función de retrollamada.
.address
address : Text
Descripción
La propiedad .address
contiene la dirección IP o el nombre de dominio de la máquina remota.
.closed
closed : Boolean
Descripción
La propiedad .closed
contiene si la conexión está cerrada. Devuelve true
si la conexión se ha cerrado, ya sea debido a un error, una llamada a shutdown()
, o el cierre por parte del servidor.
.errors
errors : Collection
Descripción
La propiedad .errors
contiene una colección de objetos de error asociados a la conexión. Each error object includes the error code, a description, and the signature of the component that caused the error.
Propiedad | Tipo | Descripción | |
---|---|---|---|
errors | Collection | Pila de error 4D en caso de error | |
[].errCode | Number | Código de error 4D | |
[].message | Text | Descripción del error 4D | |
[].componentSignature | Text | Firma del componente interno que ha devuelto el error |
.listener
listener : Object
Descripción
La propiedad .listener
contiene el objeto TCPListener
que creó la TCPConnection
, si existe. Esta propiedad es de solo lectura.
.noDelay
noDelay : Boolean
Descripción
La propiedad .noDelay
contiene si el algoritmo de Nagle está desactivado (true
) o activado (false
). Esta propiedad es de solo lectura.
.port
port : Number
Descripción
La propiedad .port
contiene el número de puerto de la máquina remota. Esta propiedad es de solo lectura.
.send()
.send( data : Blob )
Parámetros | Tipo | Descripción | |
---|---|---|---|
data | Blob | -> | Datos a enviar |
Descripción
La función send()
envía datos al servidor. Si la conexión no se ha establecido todavía, los datos se envían una vez que se ha establecido la conexión.
.shutdown()
.shutdown()
Parámetros | Tipo | Descripción | |
---|---|---|---|
No requiere ningún parámetro |
Descripción
La función shutdown()
cierra el canal write de la conexión (cliente a servidor) mientras se mantiene abierto el canal read (servidor al flujo del cliente) permitiéndole continuar recibiendo datos hasta que la conexión sea completamente cerrada por el servidor o se produzca un error.
.wait()
.wait( { timeout : Real } )
Parámetros | Tipo | Descripción | |
---|---|---|---|
timeout | Real | -> | Tiempo máximo de espera en segundos |
Descripción
La función wait()
espera hasta que se cierre la conexión TCP o se alcance el timeout
especificado
During the .wait()
execution, callback functions are executed, whether they originate from other SystemWorker
instances. Puede salir de un .wait()
llamando a shutdown()
desde una retrollamada.