Noções básicas de rede e comunicação

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

Ao criar aplicativos no Flash Player ou no AIR, você precisa frequentemente acessar recursos fora de seu aplicativo. Por exemplo, você pode enviar uma solicitação por uma imagem para um servidor web e receber os dados da imagem como retorno. Ou, você pode enviar objetos serializados de um lado para o outro sobre uma conexão socket com um servidor de aplicativos. As APIs do Flash Player e do AIR fornecem várias classes que permitem a seus aplicativos participação nesta troca. Estas APIs suportam rede com base em IP para protocolos como UDP,TCP, HTTP, RMTP e RTMFP.

AS classes a seguir podem ser utilizadas para enviar e receber dados através de uma rede:

Classe

Formatos suportados de dados

Protocolos

Descrição

Loader

SWF, PNG, JPEG, GIF

HTTP, HTTPS

Carrega tipos de dados com suporte e converte os dados em objetos de exibição.

Consulte Carregamento dinâmico do conteúdo da exibição .

URLLoader

Qualquer (texto, XML, binário, etc.)

HTTP, HTTPS

Carrega formatos arbitrários de dados. Seu aplicativo é responsável por interpretar os dados.

Consulte Uso da classe URLLoader

FileReference

Qualquer elemento

HTTP

Enviar e baixar arquivos.

Consulte Uso da classe FileReference

NetConnection

Vídeo, áudio, Formato de mensagem ActionScript (ActionScript Message Format AMF)

HTTP, HTTPS, RTMP e RTMFP

Faz conexão de vídeo, áudio e streams de objetos remotos.

Consulte Trabalho com vídeo .

Som

Áudio

HTTP

Carrega e reproduz formatos de áudio com suporte.

Consulte Carregamento de arquivos de som externos .

XMLSocket

XML

TCP

Troca mensagens XML como um servidor XMLSocket.

Consulte Soquetes XML .

Socket

Qualquer elemento

TCP

Conecta a um servidor de socket TCP.

Consulte Soquetes binários de cliente .

SecureSocket (AIR)

Qualquer elemento

TCP com SSLv3 ou TLSv1

Conecta a um servidor de socket TCP que requer segurança SSL ou TLS.

Consulte Soquetes de cliente seguros (AIR) .

ServerSocket (AIR)

Qualquer elemento

TCP

Atua como um servidor para conexões de socket TCP de entrada.

Consulte Soquetes de servidor .

DatagramSocket (AIR)

Qualquer elemento

UDP

Envia e recebe pacotes UDP.

Consulte Soquetes UDP (AIR)

Frequentemente, na criação de aplicativos web é de grande ajuda armazenar informações persistentes sobre o estado do aplicativo do usuário. Páginas e aplicativos HTML geralmente utilizam cookies para este propósito. No Flash Player, você pode utilizar a classe ShareObject para o mesmo propósito. Consulte Objetos compartilhados . (A classe SharedObject pode ser utilizada em aplicativos AIR, mas existem menos restrições ao apenas salvar os dados em um arquivo normal).

Quando o seu Flash Player ou aplicativo do AIR precisa se comunicar com outro Flash Player ou outro aplicativo do AIR no mesmo computador, você poderá utilizar a classe LocalConnection. Por exemplo, dois (ou mais) arquivos SWF na mesma página podem se comunicar. Da mesma forma, um arquivo SWF em uma página pode se comunicar com um aplicativo do AIR. Consulte Comunicação com outras instâncias do Flash Player e AIR .

Quando houver a necessidade de se comunicar com outros processos que não sejam SWF no computador local, você pode utilizar a classe NativeProcess adicionada no AIR 2. A classe NativeProcess permite ao seu aplicativo do AIR lançar e se comunicar com outros aplicativos. Consulte Comunicação com processos nativos do AIR .

Quando for necessário saber informações sobre o ambiente de rede do computador no qual um aplicativo do AIR está sendo executado, pode-se utilizar as seguintes classes:

Conceitos e termos importantes

A lista a seguir de referência contém termos importantes que você vai encontrar ao programar o código de sistemas de rede e comunicação:

Dados externos
Dados que são armazenados em algum formato fora do aplicativo do e carregados no aplicativo quando necessário. Esses dados podem ser armazenados em um arquivo que é carregado diretamente, em um banco de dados ou de algum modo que permita recuperá-los ao chamar scripts ou programas em execução no servidor.

Variáveis codificadas por URL
O formato codificado por URL permite representar diversas variáveis (pares de nomes e valores de variáveis) em uma única string de texto. Variáveis individuais são escritas no formato nome=valor. Cada variável (ou seja, cada par de nome e valor) é separada por caracteres E comercial, desta maneira: variável1=valor1&variável2=valor2. Desse modo, é possível enviar um número indefinido de variáveis como uma só mensagem.

Tipo MIME
Código padrão usado para identificar o tipo de um dado arquivo em comunicação na Internet. Qualquer tipo de arquivo que tem um código específico usado para identificá-lo. Ao enviar um arquivo ou uma mensagem, um computador (como um servidor Web ou uma ocorrência do Flash Player ou do AIR de usuário) especificará o tipo de arquivo que está sendo enviado.

HTTP
forma abreviada do termo em inglês Hypertext Transfer Protocol, um formato padrão para apresentação de páginas da Web e vários outros tipos de conteúdo enviados pela Internet.

Método de solicitação
Quando um aplicativo (como um aplicativo do AIR ou um navegador da Web) envia uma mensagem (chamada de solicitação HTTP) para um servidor Web, qualquer dado que está sendo enviado pode ser incorporado à solicitação de duas maneiras, por meio dos métodos de solicitação GET e POST. No servidor, o programa que recebe a solicitação precisará localizar os dados no trecho adequado da solicitação, por isso o método de solicitação usado para enviar dados do seu aplicativo deve corresponder ao método de solicitação usado para ler esses dados no servidor.

Conexão de soquete
Uma conexão persistente para comunicação entre dois computadores.

Carregar
é o envio de arquivos para outro computador.

Baixar
é usado para recuperar um arquivo contido em outro computador.

Interfaces de rede

Você pode usar o objeto NetworkInfo para detectar as interfaces de rede de hardware e software à disposição do seu aplicativo. O objeto NetworkInfo é um objeto singleton , e você não precisa criá-lo. Em vez disso, use a propriedade estática de classe networkInfo para acessar o único objeto NetworkInfo. Além disso, o objeto NetworkInfo gera um evento networkChange quando uma das interfaces disponíveis mudar.

Chame o método findInterfaces() para obter uma lista de objetos NetworkInterface. Cada objeto NetworkInterface da lista descreve uma das interfaces disponíveis. O objeto NetworkInterface fornece informações, tais como o endereço IP, endereço de hardware, unidade máxima de transmissão e se a interface está ativa.

O exemplo de código a seguir rastreia as propriedades do NetworkInterface de cada interface no computador 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 obter mais informações, consulte:

Mudanças na conectividade de rede

Seu aplicativo do AIR pode ser executado em ambientes com conectividade de rede incerta e em mudança. Para ajudar um aplicativo a gerenciar conexões em recursos on-line, o Adobe AIR envia um evento de mudança de rede sempre que uma conexão de rede se torna disponível ou indisponível. O objeto NetworkInfo e o objeto NativeApplication do aplicativo geram o evento networkChange . Para reagir a esse evento, adicione um ouvinte:

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

E defina uma função do manipulador de eventos:

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

O evento networkChange não indica uma mudança em toda a atividade de rede, mas apenas que uma conexão de rede individual sofreu mudança. O AIR não tenta interpretar o significado da mudança de rede. Um computador em rede pode ter várias conexões reais e virtuais, portanto, perder uma conexão não significa necessariamente perder um recurso. Por outro lado, novas conexões também não garantem melhor disponibilidade de recursos. Às vezes uma nova conexão pode até bloquear o acesso a recursos anteriormente disponíveis (por exemplo, ao se conectar a uma VPN).

Em geral, a única maneira de um aplicativo determinar se ele pode se conectar a um recurso remoto é por tentativa. A estrutura de monitoramento de serviço é um meio, com base em eventos, de reagir a mudanças na conectividade de rede de um host específico.

Nota: A estrutura de monitoramento de serviço detecta se um servidor responde de maneira aceitável a uma solicitação. Uma verificação bem-sucedida não garante conectividade plena. Serviços dimensionáveis da Web geralmente usam aparatos de cache e balanceamento de carga para redirecionar o tráfego para um cluster de servidores Web. Nessa situação, provedores de serviço só oferecem um diagnóstico parcial de conectividade de rede.

Monitoramento de serviços

O framework do monitor de serviço, separado do framework do AIR, reside no arquivo aircore.swc. Para utilizar o framework, o arquivo aircore.swc deve ser incluído no processo de criação.

O Adobe® Flash® Builder inclui essa biblioteca automaticamente.

A classe ServiceMonitor implementa a estrutura para monitorar serviços de rede e oferece uma funcionalidade básica para monitores de serviço. Por padrão, uma ocorrência da classe ServiceMonitor despacha eventos relacionados à conectividade de rede. O objeto ServiceMonitor envia esses eventos quando a instância é criada e sempre que o tempo de execução detectar uma alteração na rede. Além disso, você pode definir a propriedade pollInterval de uma ocorrência ServiceMonitor para verificar a conectividade em um intervalo especificado em milissegundos, independentemente de eventos gerais de conectividade de rede. Um objeto ServiceMonitor não verifica a conectividade de rede até que o método start() seja chamado.

A classe URLMonitor, uma subclasse da classe ServiceMonitor, detecta mudanças na conectividade HTTP para um URLRequest especificado.

A classe SocketMonitor, também uma subclasse da classe ServiceMonitor, detecta mudanças na conectividade em um host especificado de uma porta especificada.

Nota: Em versões anteriores ao AIR 2, o framework do monitor de serviço era publicado na biblioteca servicemonitor.swc. A utilização dessa biblioteca não é mais recomendada. Em vez disso, utilize a biblioteca aircore.swc.

Flash CS4 e CS5 Professional

Execute as etapas a seguir para utilizar essas classes no Adobe® Flash® CS4 ou CS5 Professional:

  1. Selecione o comando Arquivo > Configurações de publicação.

  2. Clique no botão Configurações do ActionScript 3.0. Selecione Caminho da biblioteca.

  3. Clique no botão Procurar em no SWC e navegue até a pasta AIK no diretório de instalação do Flash Professional.

  4. Dentro dessa pasta, localize o arquivo /frameworks/libs/air/aircore.swc (para AIR 2) ou /frameworks/libs/air/servicemonitor.swc (para AIR 1.5).

  5. Clique no botão OK.

  6. Adicione a seguinte instrução de importação ao código do ActionScript 3.0:
    import air.net.*;

Flash CS3 Professional

Para usar essas classes no Adobe® Flash® CS3 Professional, arraste o componente ServiceMonitorShim do painel Componentes para a Biblioteca e, em seguida, adicione a seguinte declaração import ao código do ActionScript 3.0:

import air.net.*;

Monitoramento de HTTP

A classe URLMonitor determina se podem ser feitas solicitações HTTP a um endereço especificado na porta 80 (a porta típica para comunicação HTTP). O código seguinte usa uma instância da classe URLMonitor para detectar mudanças de conectividade no site da 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); 
}

Monitoramento de soquetes

Aplicativos AIR também podem usar conexões de soquete para conectividade modelo empurrar. Firewalls e roteadores de rede geralmente restringem a comunicação em rede em portas não autorizadas, por questões de segurança. Por esse motivo, os desenvolvedores devem considerar que usuários podem nem sempre ter recursos para fazer conexões de soquete.

O código seguinte usa uma instância da classe SocketMonitor para detectar mudanças de conectividade com uma conexão de soquete. A porta monitorada é a 6667, uma porta comum do 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); 
} 

Caso o servidor socket necessite um conexão segura, você pode utilizar a classe SecureSocketMonitor ao invés da SocketMonitor.

Registro do Sistema de Nome de Domínios (DNS)

Você pode consultar os registros do recurso de DNS através da classe DNSResolver. Os registros do recurso de DNS geram informações como o endereço IP de um nome de domínio e o nome de domínio de um endereço IP. Você pode consultar os seguintes tipos de registros do recurso de DNS:

  • ARecord—endereço IPv4 de um host.

  • AAAARecord—endereço IPv6 de um host.

  • MXRecord—registro de troca de email de um host.

  • PTRRecord—nome de host de um endereço IP.

  • SRVRecord—registro de um serviço.

Para consultar um registro, transmita uma sequência de caracteres de consulta e o objeto de classe que representa o tipo de registro ao método lookup() do objeto DNSResolver. A sequência de caracteres de consulta a ser usada depende do tipo de registro:

Classe de registro

Sequência de caracteres de consulta

Exemplo de sequência de caracteres

ARecord

nome do host

“example.com”

AAAARecord

nome do host

“example.com”

MXRecord

nome do host

“example.com”

PTRRecord

Endereço IP

“208.77.188.166”

SRVRecord

Identificador de serviço: _service._protocol.host

“_sip._tcp.example.com”

O seguinte exemplo de código consulta o endereço IP do 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 obter mais informações, consulte: