Fundamentos de redes y comunicaciónFlash 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:
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 sólo 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 importantesLa siguiente lista de referencia contiene términos importantes que aparecerán al programar código de redes y comunicaciones:
Interfaces de redEl 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 redEs 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 sólo ofrecen un diagnóstico parcial de la conectividad de la red.
Supervisión del servicioEl 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 ProfessionalPara utilizar estas clases en Adobe® Flash® CS4 o CS5 Professional:
Flash CS3 ProfessionalPara 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 HTTPLa 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 SocketLas 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:
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:
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: |
|