Saltar al contenido principal
Versión: 20 R9 BETA

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
LanzamientoModificaciones
20 R9Nuevos atributos listener, address y port
20 R8Clase 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ámetrosTipoDescripción
serverAddressText->Nombre de dominio o dirección IP del servidor
serverPortInteger->Número de puerto del servidor
optionsObject->Configuración opciones para la conexión
ResultadoTCPConnection<-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:

PropiedadTipoDescripciónPor defecto
onConnectionFormulaRetrollamada que se activa cuando se establece la conexión.Indefinido
onDataFormulaRetrollamada activada cuando se reciben datosIndefinido
onShutdownFormulaRetrollamada activada cuando la conexión se cierra correctamenteIndefinido
onErrorFormulaRetrollamada en caso de errorIndefinido
onTerminateFormulaRetrollamada activada justo antes de que se libere la TCPConnectionIndefinido
noDelayBooleanSólo lectura cesactiva el algoritmo de Nagle si trueFalse

Función callback (retrollamada)

Todas las funciones de retrollamada reciben dos parámetros:

ParámetrosTipoDescripción
$connectionobjeto TCPConnectionLa instancia de conexión TCP actual.
$eventobjeto TCPEventContiene información sobre el evento.

Secuencia de retrollamadas:

  1. onConnection se activa cuando se establece la conexión.
  2. onData se activa cada vez que se reciben datos.
  3. Se activa onShutdown o onError:
    • onShutdown se activa cuando la conexión se cierra correctamente.
    • onError se activa si se produce un error.
  4. 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.

PropiedadTipoDescripción
errorsCollectionPila de error 4D en caso de error
[].errCodeNumberCódigo de error 4D
[].messageTextDescripción del error 4D
[].componentSignatureTextFirma 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ámetrosTipoDescripción
dataBlob->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ámetrosTipoDescripció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ámetrosTipoDescripción
timeoutReal->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

nota

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.