Fundamentos de redes y comunicación

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

Cuando se crean aplicaciones en Flash Player o en AIR, se suele necesitar tener acceso a recursos externos a la aplicación. Por ejemplo, tal vez quiera enviar una solicitud para una imagen en un servidor web de Internet y obtener los datos de dicha imagen. O tal vez enviar objetos serializados a través de una conexión de socket con un servidor de aplicaciones. Las API de Flash Player y AIR ofrecen varias clases que permiten que las aplicaciones participen en este intercambio. Estas API admiten redes basadas en IP para protocolos como UDP, TCP, HTTP, RTMP y RTMFP.

Se pueden utilizar las siguientes clases para enviar y recibir datos en una red:

Clase

Formatos de datos admitidos

Protocolos

Descripción

Loader

SWF, PNG, JPEG, GIF

HTTP, HTTPS

Carga tipos de datos admitidos y los convierte en un objeto de visualización.

Consulte Carga dinámica de contenido de visualización .

URLLoader

Cualquiera (texto, XML, binario, etc.)

HTTP, HTTPS

Carga formatos arbitrarios de datos. Es responsabilidad de su aplicación interpretar los datos.

Consulte Uso de la clase URLLoader

FileReference

Cualquiera

HTTP

Carga y descarga archivos.

Consulte Uso de la clase FileReference

NetConnection

Vídeo, audio, formato de mensaje de ActionScript (AMF)

HTTP, HTTPS, RTMP, RTMFP

Se conecta a flujos de vídeo, audio y objetos remotos.

Consulte Trabajo con vídeo .

Sound

Audio

HTTP

Carga y reproduce formatos de audio admitidos.

Consulte Carga de archivos de sonido externos .

XMLSocket

XML

TCP

Intercambia mensajes XML con un servidor XMLSocket.

Consulte Sockets XML .

Socket

Cualquiera

TCP

Se conecta a un servidor de socket TCP.

Consulte Sockets de cliente binarios .

SecureSocket (AIR)

Cualquiera

TCP con SSLv3 o TLSv1

Se conecta a un servidor de sockets TCP que requiere seguridad SSL o TLS.

Consulte Sockets de cliente seguros (AIR) .

ServerSocket (AIR)

Cualquiera

TCP

Actúa como servidor para conexiones de socket TCP entrantes.

Consulte Sockets de servidor .

DatagramSocket (AIR)

Cualquiera

UDP

Envía y recibe paquetes UDP.

Consulte Sockets UDP (AIR)

A menudo, cuando se crea una aplicación web resulta útil almacenar información persistente sobre el estado de la aplicación del usuario. Las páginas y las aplicaciones suelen usar cookies para esto. En Flash Player, puede utilizar la clase SharedObject para el mismo fin. Consulte Objetos compartidos . (La clase SharedObject se puede utilizar en aplicaciones de AIR, pero hay menos restricciones cuando solo se guardan los datos en un archivo normal.)

Cuando la aplicación de Flash Player o de AIR necesita comunicarse con otra aplicación de Flash Player o de AIR en el mismo equipo, puede utilizar la clase LocalConnection. Por ejemplo, dos (o más) archivos SWF de la misma página web pueden comunicarse entre sí. Del mismo modo, un archivo SWF que se ejecute en una página web puede comunicarse con una aplicación de AIR. Consulte Conexión con otras instancias de Flash Player y AIR .

Cuando necesite comunicarse con otros procesos no SWF del equipo local, puede utilizar la clase NativeProcess añadida en AIR 2. La clase NativeProcess permite a la aplicación de AIR iniciar y comunicarse con otras aplicaciones. Consulte Comunicación con procesos nativos en AIR .

Cuando necesite información sobre el entorno de red del equipo en el que se ejecuta la aplicación de AIR, puede utilizar las siguientes clases:

Conceptos y términos importantes

La siguiente lista de referencia contiene términos importantes que aparecerán al programar código de redes y comunicaciones:

Datos externos
Datos que se guardan fuera de la aplicación de y se cargan en la aplicación cuando se necesitan. Estos datos pueden estar almacenados en un archivo que se carga directamente o en una base de datos u otra forma, y se recuperan llamando a scripts o programas que se ejecutan en un servidor.

Variables con codificación URL
El formato de codificación URL permite representar varias variables (pares de nombre y valor de variables) en una sola cadena de texto. Las variables individuales se escriben con el formato nombre=valor. Cada variable (es decir, cada par nombre-valor) se separa con caracteres ampersand del modo siguiente: variable1=valor1&variable2=valor2. De este modo, es posible enviar un número indefinido de variables en un único mensaje.

Tipo MIME
Código estándar empleado para identificar el tipo de un archivo determinado en comunicaciones de Internet. Cualquier tipo de archivo tiene un código específico que se utiliza para su identificación. Cuando se envía un archivo o un mensaje, un programa (como un servidor web o la instancia de Flash Player o AIR de un usuario) especifica el tipo de archivo que se envía.

HTTP
protocolo de transferencia de hipertexto. Es un formato estándar para entregar páginas web y otros tipos de contenido enviado a través de Internet.

Método de petición
Cuando una aplicación (como una aplicación de AIR o un navegador web) envía un mensaje (denominado solicitud HTTP) a un servidor web, los datos enviados pueden incorporarse en la solicitud de dos maneras distintas: los dos métodos de solicitud GET y POST. En el extremo del servidor, el programa que recibe la solicitud tendrá que mirar en la parte apropiada de la solicitud para encontrar los datos, por lo que el método de solicitud utilizado para enviar datos desde ActionScript debe coincidir con el método de solicitud utilizado para leer los datos en el servidor.

Conexión de socket
Conexión constante para permitir la comunicación entre dos ordenadores.

Carga
Envío de un archivo a otro equipo.

Descarga
Recuperación de un archivo de otro equipo.

Interfaces de red

El objeto NetworkInfo se puede utilizar para descubrir las interfaces de red de hardware y software disponibles en la aplicación. NetworkInfo es un objeto singleton y no es necesario crear uno. Utilice la propiedad de clase estática, networkInfo , para acceder a un solo objeto NetworkInfo. El objeto NetworkInfo también distribuye un evento networkChange cuando cambia una de las interfaces disponibles.

Llame al método findInterfaces() para obtener una lista de objetos NetworkInterface. Cada objeto NetworkInterface de la lista describe una de las interfaces disponible. El objeto NetworkInterface proporciona información como la dirección IP, la dirección de hardware, la unidad de transmisión máxima y si la interfaz está activa.

En el siguiente ejemplo de código se realiza el seguimiento de las propiedades de NetworkInterface en cada interfaz del equipo cliente:

package { 
import flash.display.Sprite; 
import flash.net.InterfaceAddress; 
import flash.net.NetworkInfo; 
import flash.net.NetworkInterface; 
 
public class NetworkInformationExample extends Sprite 
{ 
    public function NetworkInformationExample() 
    { 
        var networkInfo:NetworkInfo = NetworkInfo.networkInfo; 
        var interfaces:Vector.<NetworkInterface> = networkInfo.findInterfaces(); 
         
        if( interfaces != null ) 
        { 
            trace( "Interface count: " + interfaces.length ); 
            for each ( var interfaceObj:NetworkInterface in interfaces ) 
            { 
                trace( "\nname: "             + interfaceObj.name ); 
                trace( "display name: "     + interfaceObj.displayName ); 
                trace( "mtu: "                 + interfaceObj.mtu ); 
                trace( "active?: "             + interfaceObj.active ); 
                trace( "parent interface: " + interfaceObj.parent ); 
                trace( "hardware address: " + interfaceObj.hardwareAddress ); 
                if( interfaceObj.subInterfaces != null ) 
                { 
                    trace( "# subinterfaces: " + interfaceObj.subInterfaces.length ); 
                } 
                trace("# addresses: "     + interfaceObj.addresses.length ); 
                for each ( var address:InterfaceAddress in interfaceObj.addresses ) 
                { 
                    trace( "  type: "           + address.ipVersion ); 
                    trace( "  address: "         + address.address ); 
                    trace( "  broadcast: "         + address.broadcast ); 
                    trace( "  prefix length: "     + address.prefixLength ); 
                } 
            }             
        } 
    }     
} 
}

Para obtener más información, consulte:

Cambios de conectividad de la red

Es posible que la aplicación de AIR se ejecute en un entorno en que la conectividad de la red es inestable o variable. Para ayudar a una aplicación gestionar la conexión a los recursos en línea, Adobe AIR envía un evento de cambio en la red siempre que se corta o vuelve a disponer de la conexión a la red. Tanto NetworkInfo como el objeto NativeApplication de la aplicación distribuyen el evento networkChange . Para reaccionar a este evento, añada un detector:

NetworkInfo.networkInfo.addEventListener(Event.NETWORK_CHANGE, onNetworkChange); 

Defina también una función de controlador de eventos:

function onNetworkChange(event:Event) 
{ 
    //Check resource availability 
} 

El evento networkChange no indica un cambio en toda la actividad de la red, sino solamente que ha cambiado la conexión. AIR no intenta interpretar el significado del cambio en la red. Un ordenador conectado en red puede tener muchas conexiones reales y virtuales, de modo que si se pierde una conexión, no significa necesariamente que se pierde un recurso. Por otro lado, las conexiones nuevas tampoco garantizan una mejor disponibilidad del recurso. A veces una conexión nueva puede incluso bloquear el acceso a los recursos que antes estaban disponibles (por ejemplo, cuando se realiza una conexión a una VPN).

En general, la única forma de que una aplicación determine si puede conectarse a un recurso remoto es intentar hacerlo. La arquitectura de supervisión del servicio proporciona medios basados en eventos para responder a los cambios de conectividad de red en un host especificado.

Nota: el marco de supervisión del servicio detecta si un servidor responde a una petición de forma aceptable. Una comprobación correcta no garantiza la total conectividad. Los servicios web escalables hacen uso frecuente de los aparatos de caché y equilibrio de carga para redirigir el flujo de tráfico a un grupo de servidores web. En esta situación, los proveedores de servicios solo ofrecen un diagnóstico parcial de la conectividad de la red.

Supervisión del servicio

El marco de supervisión del servicio, que es independiente de la arquitectura de AIR, reside en el archivo aircore.swc. Para poder utilizar el marco hay que incluir el archivo aircore.swc en el proceso de creación.

Adobe® Flash® Builder incluye esta biblioteca automáticamente.

La clase ServiceMonitor implementa el marco para supervisar los servicios de red y ofrece funciones básicas para los supervisores del servicio. De forma predeterminada, una instancia de la clase ServiceMonitor distribuye eventos relacionados con la conectividad de la red. El objeto ServiceMonitor distribuye estos eventos cuando se crea la instancia y siempre que Adobe AIR detecte un cambio en la red. Se puede además definir la propiedad pollInterval de una instancia ServiceMonitor para que compruebe la conectividad en intervalos especificados en milisegundos, independientemente de los eventos de conectividad de la red en general. Un objeto ServiceMonitor no comprueba la conectividad de la red hasta que se haya llamado al método start() .

La clase URLMonitor, una subclase de la clase ServiceMonitor, detecta cambios en la conectividad de HTTP para una petición URLRequest especificada.

La clase SocketMonitor, otra subclase de la clase ServiceMonitor, detecta cambios en la conectividad a un host especificado en un puerto especificado.

Nota: antes de AIR 2, el marco de supervisión del servicio se pubicaba en la biblioteca servicemonitor.swc. Esta biblioteca ya no se utiliza en esta versión. Utilice en su lugar la bibilioteca aircore.swc.

Flash CS4 y CS5 Professional

Para utilizar estas clases en Adobe® Flash® CS4 o CS5 Professional:

  1. Seleccione Archivo > Configuración de publicación.

  2. Haga clic en el botón Configuración en la opción para seleccionar ruta de biblioteca de ActionScript 3.0.

  3. Haga clic en el botón Navegar hasta el archivo SWC y busque la carpeta AIK en la carpeta de instalación de Flash Professional.

  4. En esta carpeta, localice /frameworks/libs/air/aircore.swc (para AIR 2) o /frameworks/libs/air/servicemonitor.swc (para AIR 1.5).

  5. Haga clic en el botón Aceptar.

  6. Agregue la siguiente sentencia de importación a su código de ActionScript 3.0:
    import air.net.*;

Flash CS3 Professional

Para utilizar estas clases en Adobe® Flash® CS3 Professional, arrastre el componente ServiceMonitorShim del panel Componentes a la Biblioteca y después añada la siguiente sentencia import al código ActionScript 3.0:

import air.net.*;

Control de HTTP

La clase URLMonitor determina si se pueden realizar peticiones de HTTP a una dirección especificada en el puerto 80 (el puerto habitual para la comunicación con HTTP). El siguiente código utiliza una instancia de la clase URLMonitor para detectar cambios de conectividad con el sitio web de Adobe:

import air.net.URLMonitor; 
import flash.net.URLRequest; 
import flash.events.StatusEvent; 
var monitor:URLMonitor; 
monitor = new URLMonitor(new URLRequest('http://www.example.com')); 
monitor.addEventListener(StatusEvent.STATUS, announceStatus); 
monitor.start(); 
function announceStatus(e:StatusEvent):void { 
    trace("Status change. Current status: " + monitor.available); 
}

Control de Socket

Las aplicaciones de AIR también pueden utilizar conexiones de socket para la conectividad modelo "push". Por razones de seguridad, los cortafuegos y encaminadores de red suelen restringir la comunicación por la red a través de puertos no autorizados. Por este motivo los desarrolladores deben tener en cuenta la posibilidad de que los usuarios no puedan realizar conexiones de socket.

El siguiente código utiliza una instancia de la clase SocketMonitor para detectar cambios de conectividad en una conexión de socket. El puerto supervisado es 6667, un puerto común para IRC:

import air.net.ServiceMonitor; 
import flash.events.StatusEvent; 
 
socketMonitor = new SocketMonitor('www.example.com',6667); 
socketMonitor.addEventListener(StatusEvent.STATUS, socketStatusChange); 
socketMonitor.start(); 
 
function announceStatus(e:StatusEvent):void { 
    trace("Status change. Current status: " + socketMonitor.available); 
} 

Si el servidor de socket requiere una conexión segura, puede utilizar la clase SecureSocketMonitor en vez de SocketMonitor.

Registros del sistema de nombres de dominio (DNS)

Se pueden realizar búsquedas en los registros del recurso DNS utilizando la clase DNSResolver. Los registros del recurso DNS ofrecen información como la dirección IP de un nombre de dominio y el nombre de dominio de una dirección IP. Se pueden realizar búsquedas en los siguientes tipos de registros del recurso DNS:

  • ARecord: dirección IPv4 de un host.

  • AAAARecord: dirección IPv6 de un host.

  • MXRecord: registro de intercambio de correo para un host.

  • PTRRecord: nombre de host para una dirección IP.

  • SRVRecord: registro de servicio para un servicio..

Para buscar en un registro, se transmite una cadena de consulta y el objeto de la clase que representa el tipo de registro al método lookup() del objeto DNSResolver. La cadena de consulta depende del tipo de registro:

Clase de registro

Cadena de consulta

Cadena de consulta de ejemplo

ARecord

Nombre de host

“example.com”

AAAARecord

Nombre de host

“example.com”

MXRecord

Nombre de host

“example.com”

PTRRecord

Dirección IP

“208.77.188.166”

SRVRecord

Identificador de servicio: _service._protocol.host

“_sip._tcp.example.com”

El siguiente ejemplo de código busca la dirección IP del host “example.com”.

package 
{ 
    import flash.display.Sprite; 
    import flash.events.DNSResolverEvent; 
    import flash.events.ErrorEvent; 
    import flash.net.dns.ARecord; 
    import flash.net.dns.DNSResolver; 
 
    public class DNSResolverExample extends Sprite 
    { 
         
        public function DNSResolverExample() 
        { 
            var resolver:DNSResolver = new DNSResolver(); 
            resolver.addEventListener( DNSResolverEvent.LOOKUP, lookupComplete ); 
            resolver.addEventListener( ErrorEvent.ERROR, lookupError ); 
 
            resolver.lookup( "example.com.", ARecord ); 
        } 
         
        private function lookupComplete( event:DNSResolverEvent ):void 
        { 
            trace( "Query string: " + event.host ); 
            trace( "Record count: " + event.resourceRecords.length ); 
            for each( var record:* in event.resourceRecords ) 
            { 
                if( record is ARecord ) trace( record.address ); 
            } 
             
        } 
 
        private function lookupError( error:ErrorEvent ):void 
        { 
            trace("Error: " + error.text ); 
        } 
    } 
}

Para obtener más información, consulte: