Artículo
· 10 mar, 2025 Lectura de 5 min

Presentación del adaptador UDP

Hola

Este artículo es el resultado de la pregunta que había hecho a la comunidad: Adaptador UDP no funciona

En este artículo, voy a presentaros

1) ¿Qué es "UDP"?
2) El estado actual de Iris con UDP
3) Mi solución con el adaptador UDP



1) ¿Qué es "UDP"?

UDP significa User Datagram Protocol. Es uno de los protocolos fundamentales del conjunto de protocolos de Internet (IP) y se utiliza para transmitir datos a través de una red. Aquí tenéis algunas características clave de UDP:

  1. Sin conexión: UDP no establece una conexión antes de enviar datos, lo que significa que puede enviar mensajes (Datagram) sin un proceso previo de sincronización.
  2. No fiable: No hay garantía de que los mensajes enviados a través de UDP lleguen a su destino. No cuenta con mecanismos de recuperación de errores ni retransmisión de paquetes perdidos.
  3. Velocidad: Al no requerir conexión ni comprobaciones o correcciones de errores, UDP es generalmente más rápido que TCP (Protocolo de Control de Transmisión), lo que lo hace adecuado para aplicaciones en las que la velocidad es crucial.
  4. Orientado a datagramas: UDP envía mensajes en forma de paquetes discretos, que pueden tener longitudes variables. Cada paquete se trata de manera independiente.
  5. Casos de uso: Se usa comúnmente en aplicaciones donde la velocidad es más importante que la fiabilidad, como la transmisión de vídeo, los videojuegos en línea, la telefonía por Internet (VoIP) y las comunicaciones en tiempo real.

En resumen, UDP es un protocolo ligero y útil para aplicaciones específicas en las que la baja latencia es esencial.


2) El estado actual de Iris con UDP

Por supuesto, InterSystems Iris permite utilizar este protocolo para enviar y recibir datos.

Como protocolo REST, hay dos formas de hacerlo :

- con la función ##class(%Net.UDP).%New().

- con el EnsLib.UDP.OutboundAdapter y EnsLib.UDP.InboundAdapter

 

##class(%Net.UDP).%New()

Aunque la documentación de la clase es muy completa, aquí está el enlace de la documentación de InterSystems sobre cómo usarla.

Para enviar/recibir datos con ella, usamos una instancia de la clase(%Net.UDP).%New() y algún método vinculado a ella. En resumen, para enviar datos (en localhost con el puerto 3001) :

SET client = ##class(%Net.UDP).%New()
SET addrbin = ##class(%Net.UDP).GetHostAddr("127.0.0.1")
Set status = client.Send("message text", addrbin, 3001)

Para recibir datos (en localhost con el puerto 3001) :

Set sobj = ##class(%Net.UDP).%New(3001,"127.0.0.1")
Set data = sobj.Recv()

EnsLib.UDP.OutboundAdapter y EnsLib.UDP.InboundAdapter
Este es más simple : es un adaptador.
Aquí la documentación : EnsLib.UDP.OutboundAdapter et EnsLib.UDP.InboundAdapter
Para enviar datos :

Set status = ..Adapter.SendStream(stream)

Para recibir datos:

Set status = ..Adapter.Receive(stream)

Sin embargo, no funciona. Pregunté a la comunidad con mi problema «UDP Adapter not working» y creé un ticket para el WRC. Me respondieron esto :

El ejecutable subyacente ya no se instala en el producto desde Ensemble 2018.1.

Lo he comprobado internamente y se ha enviado JIRA DP-437486 para actualizar esos adaptadores y que utilicen la clase %Net.UDP, pero esto estará sujeto a la aprobación de la dirección del producto y a los recursos de desarrollo disponibles.

Lamentablemente, la única opción ahora mismo es crear su propio adaptador personalizado utilizando la clase %Net.UDP.

Las dos diferencias principales entre la clase(%Net.UDP) y el EnsLib.UDP.OutboundAdapter son

  • La clase %Net.UDP utiliza la clase de sistema $System.UDP, por lo que utiliza código del núcleo de Cache/IRIS para enviar/recibir los mensajes UDP, mientras que el adaptador UDP utiliza un pipeline de comandos para llamar a ejecutables externos para enviar/recibir el mensaje UDP.
  • La clase %Net.UDP envía/lee una cadena mientras que el adaptador UDP utiliza un stream para enviar/leer mensajes.

 

3) Mi solución con el adaptador UDP

Por lo tanto, escribí la mía propia (aprobado por el support team) para enviar datos :

/// Adapter to send data with UDP Connection
Class USER.UDP.OutboundAdapter Extends Ens.Adapter
{

/// Host of the UDP server
Property Host As %String [ Required ];
/// Port of the UDP server
Property Port As %Integer [ Required ];
/// if 1, show the text that will be sent
Property UDPTrace As %Integer(VALUELIST = ",0,1") [ InitialExpression = 0, Required ];
Parameter SETTINGS = "Host:Basic,Port:Basic,UDPTrace:Basic";
/// Send "text" throught the UDP connection
Method SendDataText(text As %String) As %Status
{
    Try {
        Set status = $$$OK
        If ..UDPTrace=1
        {
            Do ..ShowText(text)
        }
        
        Set udpClient = ##class(%Net.UDP).%New()
        Set addrbin = ##class(%Net.UDP).GetHostAddr(..Host)

        Set sentBytes = udpClient.Send(text, addrbin, ..Port)
    }
    Catch exception {
        Set status = exception.AsStatus()
    }    
    Return status
}

/// Convert "stream" into text and send it throught the UDP connection
Method SendDataStream(stream As %Stream.Object) As %Status
{
    Try {
        Do stream.Rewind()
        Set text = ""
        While 'stream.AtEnd{
            Set text = text _ stream.Read()
        }

        Set status = ..SendDataText(text)
    }
    Catch exception {
        Set status = exception.AsStatus()
    }    
    Return status
}

/// Convert "object" into json and send it throught the UDP connection
Method SendDataJSONObject(object As %RegisteredObject, format As %String = "iw") As %Status
{
    Try {
        Set status = ##class(%ZEN.Auxiliary.jsonProvider).%WriteJSONStreamFromObject(.stream,object,,,,format)
        $$$ThrowOnError(status)
        
        Set status = ..SendDataStream(stream)
    }
    Catch exception {
        Set status = exception.AsStatus()
    }    
    Return status
}

/// Takes a text as input,
/// Displays the traces of the associated object
Method ShowText(text As %String)
{
    Set nbParty = $SYSTEM.SQL.CEILING($LENGTH(text)/1100)
    For ii=1:1:nbParty
    {
        $$$TRACE($EXTRACT(text,ii,ii+1100))
    }
}

}

 

Espero que este artículo haya sido, si no útil, interesante.

No he probado el EnsLib.UDP.InboundAdapter, así que sentíos libres de añadir más información en los comentarios.


Corentin

Comentarios (0)1
Inicie sesión o regístrese para continuar