Podstawowe informacje o pracy w sieci i komunikacji

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Podczas tworzenia aplikacji w programach Flash Player lub AIR często wymagane jest uzyskanie dostępu do zasobów spoza aplikacji. Na przykład, wymagane może być wysłanie żądania obrazu na serwer sieci WWW i uzyskanie zwróconych danych obrazu. Możliwe może też być wysłanie serializowanych obiektów i odebranie ich z powrotem poprzez połączenie przez gniazdo z serwerem aplikacji. Interfejsy API programu Flash Player i AIR udostępniają kilka klas umożliwiających aplikacjom uczestnictwo w takiej wymianie. Te interfejsy API obsługują pracę w sieci opartą na adresie IP dla protokołów takich, jak UDC, TCP, HTTP, RTMP i RTMFP.

Poniższe klasy można wykorzystać w celu wysłania i pobrania danych przez sieć:

Klasa

Obsługiwane formaty danych

Protokoły

Opis

Loader

SWF, PNG, JPEG, GIF

HTTP, HTTPS

Służy do wczytywania obsługiwanych typów danych i przekształcania danych w obiekt ekranowy.

Patrz część Dynamiczne ładowanie treści wyświetlanych .

URLLoader

Dowolne (tekstowe, XML, binarne itd.)

HTTP, HTTPS

Służy do ładowania dowolnych formatów danych. To aplikacja odpowiada za interpretację danych.

Patrz część Korzystanie z klasy URLLoader .

FileReference

Dowolne

HTTP

Służy do wczytywania i pobierania plików.

Patrz część Korzystanie z klasy FileReference .

NetConnection

Wideo, audio, ActionScript Message Format (AMF)

HTTP, HTTPS, RTMP, RTMFP

Służy do łączenia ze strumieniami wideo, audio i obiektów zdalnych.

Patrz część Praca z wideo .

Dźwięk

Dźwięk

HTTP

Służy do wczytywania i odtwarzania obsługiwanych formatów audio.

Patrz część Ładowanie zewnętrznych plików dźwiękowych .

XMLSocket

XML

TCP

Służy do wymiany komunikatów XML z serwerem XMLSocket.

Patrz część Gniazda XML .

Socket

Dowolne

TCP

Służy do łączenia z serwerem gniazd TCP.

Patrz część Gniazda binarne na kliencie .

SecureSocket (AIR)

Dowolne

TOC z SSLv3 lub TLSv1

Służy do łączenia z serwerem gniazd TCP, który wymaga zabezpieczeń SSL lub TLS.

Patrz część Bezpieczne gniazda klienckie (AIR) .

ServerSocket (AIR)

Dowolne

TCP

Służy jako serwer dla połączeń przychodzących do gniazda TCP.

Patrz rozdział Gniazda serwerowe .

DatagramSocket (AIR)

Dowolne

UDP

Służy do wysyłania i odbierania pakietów UDP.

Patrz część Gniazda UDP (AIR) .

Często podczas tworzenia aplikacji sieci WWW przydatne jest zapisywanie trwałych informacji o stanie aplikacji użytkownika. Strony i aplikacje HTML zazwyczaj wykorzystują do tego celu pliki cookie. W programie Flash Player w tym samym celu można użyć klasy SharedObject. Patrz część Obiekty udostępnione . (Klasa SharedObject może być wykorzystywana w aplikacjach AIR, ale zdecydowanie mniej ograniczeń będzie obowiązywać, jeśli dane zostaną po prostu zapisane do zwykłego pliku.)

Gdy w aplikacji środowiska Flash Player lub AIR wymagana jest komunikacja z inną aplikacją środowiska Flash Player lub AIR na tym samym komputerze, można zastosować klasę LocalConnection. Na przykład, dwa (lub więcej) pliki SWF na tej samej stronie WWW mogą komunikować się ze sobą. Podobnie, plik SWF działający na stronie WWW może komunikować się z aplikacją środowiska AIR. Patrz część Komunikacja z innymi instancjami programu Flash Player lub programu AIR .

Gdy wymagana jest komunikacją z innym, różnym od SWF procesem na lokalnym komputerze, można zastosować klasę NativeProcess, która została dodana w programie AIR 2. Klasa NativeProcess umożliwia aplikacji środowiska AIR uruchomienie innych aplikacji i komunikację z nimi. Patrz część Komunikacja z procesami rodzimymi w środowisku AIR .

Gdy wymagane są informacje na temat środowiska sieciowego komputera, na którym uruchomiona jest aplikacja AIR, można skorzystać z następujących klas:

Ważne pojęcia i terminy

Na poniższej liście wyjaśniono znaczenie ważnych terminów stosowanych w kontekście programowania obsługi sieci i komunikacji.

Dane zewnętrzne
Dane zapisane na zewnątrz aplikacji i ładowane do aplikacji w razie potrzeby. Te dane mogą być zapisane w pliku ładowanym bezpośrednio lub zapisanym w bazie danych albo w innej postaci pobieranej poprzez wywoływanie skryptów lub programów działających na serwerze.

Zmienne zakodowane zgodnie z URL
Format kodowania URL stanowi sposób reprezentacji kilku zmiennych (pary nazw zmiennych i wartości) w pojedynczym fragmencie tekstu. Pojedyncze zmienne są zapisane w formacie name=value. Zmienne (tj. pary nazwa-wartość) są rozdzielone znakami ampersandu, np.: variable1=value1&variable2=value2. Dzięki temu w postaci jednego komunikatu można wysłać nieskończoną liczbę zmiennych.

Typ MIME
Standardowy kod służący do identyfikowania typu określonego pliku w komunikacji internetowej. Każdy typ pliku ma określony kod służący do identyfikowania pliku. Podczas wysyłania pliku lub komunikatu komputer (np. serwer sieci Web lub instancja programu Flash Player albo środowiska AIR) określa typ wysyłanego pliku.

HTTP
Protokół Hypertext Transfer Protocol — standardowy format dostarczania stron sieci Web i różnych innych typów treści, które są przesyłane w Internecie.

Metoda żądania
Gdy aplikacja (taka jak aplikacja środowiska AIR lub przeglądarka internetowa) wysyła komunikat (nazywany żądaniem HTTP) do serwera sieci Web, wówczas wysyłane dane mogą zostać osadzone w żądaniu na dwa sposoby; te dwa sposoby to metody żądań: GET i POST. Po stronie serwera program odbierający żądanie będzie musiał znaleźć dane w odpowiedniej części żądania, dlatego metoda żądania używana do wysyłania danych z aplikacji użytkownika musi być zgodna z metodą żądania używaną do odczytywania danych na serwerze.

Połączenie przez gniazdo
Stałe połączenie umożliwiające komunikację między dwoma komputerami.

Wysyłanie
Wysyłanie pliku do innego komputera.

Pobieranie
Uzyskiwanie pliku z innego komputera.

Interfejsy sieciowe

Obiektu NetworkInfo można używać do wykrywania sprzętowych i programowych interfejsów sieciowych dostępnych dla aplikacji. NetworkInfo jest obiektem typu singleton ; nie trzeba go jawnie tworzyć. Dostęp do jedynego istniejącego obiektu NetworkInfo uzyskuje się za pośrednictwem statycznej właściwości klasy, networkInfo . Obiekt NetworkInfo wywołuje również zdarzenie networkChange , gdy zajdzie zmiana w jednym z dostępnych interfejsów.

Aby uzyskać listę obiektów NetworkInterface, należy wywołać metodę findInterfaces() . Każdy obiekt NetworkInterface na liście opisuje jeden z dostępnych interfejsów. Obiekt NetworkInterface zawiera takie informacje, jak adres IP, adres sprzętowy, rozmiar maksymalnej jednostki transmisji (MTU) i status aktywności interfejsu.

Poniższy przykładowy kod wyświetla właściwości NetworkInterface każdego z interfejsów komputera klienckiego:

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 ); 
                } 
            }             
        } 
    }     
} 
}

Więcej informacji:

Zmiany stanu połączeń sieciowych

Aplikacja AIR może działać w środowiskach, w których stan połączeń sieciowych będzie zmienny lub niestabilny. Aby ułatwić zarządzanie połączeniami z zasobami sieciowymi w ramach aplikacji, środowisko AIR wysyła zdarzenie zmiany stanu sieci za każdym razem, gdy połączenie sieciowe stanie się dostępne lub niedostępne. Zarówno obiekt NetworkInfo, jak i obiekt NativeApplication aplikacji wywołują zdarzenie networkChange . Aby zareagować na to zdarzenie, należy dodać detektor:

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

Oraz zdefiniować funkcję obsługi zdarzenia:

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

Zdarzenie networkChange nie oznacza każdej zmiany w aktywności sieci, a jedynie zmianę stanu jednego z połączeń sieciowych. Środowisko AIR nie próbuje interpretować znaczenia zmiany stanu połączenia sieciowego. Komputer pracujący w sieci może mieć wiele połączeń rzeczywistych i wirtualnych, a zatem utrata połączenia nie musi być równoznaczna z utratą dostępu do zasobu. Z drugiej strony, nowe połączenia nie gwarantują lepszej dostępności zasobu. Niekiedy nowe połączenie może nawet zablokować dostęp do zasobów, które były wcześniej dostępne (na przykład w wypadku połączenia z siecią VPN).

Co do zasady, jedynym sposobem sprawdzenia, czy aplikacja może połączyć się z zasobem zdalnym, jest podjęcie próby takiego połączenia. Architektura monitorowania usług udostępnia oparty na zdarzeniach mechanizm reagowania na zmiany stanu połączeń sieciowych z konkretnym hostem.

Uwaga: Architektura monitorowania usług wykrywa, czy serwer w sposób akceptowalny reaguje na żądanie. Pozytywny wynik sprawdzenia nie gwarantuje pełnej łączności. Skalowalne usługi Web Service często korzystają z mechanizmów buforowania i równoważenia ruchu, które przekierowują ruch do klastra serwerów sieci Web. W takiej sytuacji dostawcy usług zapewniają tylko częściową diagnostykę łączności sieciowej.

Monitorowanie usług

Architektura monitorowania usług, odrębna od architektury AIR, rezyduje w pliku aircore.swc. Aby skorzystać z tej architektury, należy uwzględnić plik aircore.swc w procesie budowania.

Program Adobe® Flash® Builder uwzględnia tę bibliotekę automatycznie.

Klasa ServiceMonitor implementuje architekturę monitorowania usług sieciowych i udostępnia podstawową funkcjonalność dla monitorów usług. Domyślnie instancja klasy ServiceMonitor wywołuje zdarzenia dotyczące połączeń sieciowych. Obiekt ServiceMonitor wywołuje te zdarzenia przy tworzeniu instancji i za każdym razem, gdy środowisko wykonawcze wykryje zmianę stanu sieci. Ponadto możliwe jest ustawienie właściwości pollInterval instancji klasy ServiceMonitor w taki sposób, aby stan połączeń był sprawdzany co zadaną liczbę milisekund, niezależnie od zdarzeń zmiany stanu połączeń sieciowych. Obiekt ServiceMonitor nie sprawdza połączeń sieciowych, zanim nie zostanie wywołana metoda start() .

Klasa URLMonitor, będąca podklasą klasy ServiceMonitor, wykrywa zmiany w połączeniach HTTP dla określonego obiektu URLRequest.

Klasa SocketMonitor, która również jest podklasą klasy ServiceMonitor, wykrywa zmiany w łączności z określonym hostem na określonym porcie.

Uwaga: W wersjach środowiska AIR wcześniejszych niż 2 struktura monitora usług była publikowana w bibliotece servicemonitor.swc. Ta biblioteka ma obecnie status przestarzałej. Należy zamiast niej używać biblioteki aircore.swc.

Flash CS4 i CS5 Professional

Aby skorzystać z tych klas w programie Adobe® Flash® CS4 lub CS5 Professional:

  1. Wybierz polecenie Plik > Ustawienia publikowania.

  2. Kliknij przycisk Ustawienia dla ActionScript 3.0. Wybierz ścieżkę biblioteki.

  3. Kliknij przycisk Przeglądaj w poszukiwaniu SWC i przejdź do folderu AIK w folderze instalacyjnym programu Flash Professional.

  4. W folderze tym znajdź plik /frameworks/libs/air/aircore.swc (w środowisku AIR 2) lub /frameworks/libs/air/servicemonitor.swc (w środowisku AIR 1.5).

  5. Kliknij przycisk OK.

  6. Dodaj poniższą instrukcję importowania do kodu w języku ActionScript 3.0:
    import air.net.*;

Flash CS3 Professional

Aby użyć klas w programie Adobe® Flash® CS3 Professional, należy przeciągnąć składnik ServiceMonitorShim z panelu Składniki do Biblioteki. Następnie należy dodać poniższą instrukcję import do kodu w języku ActionScript 3.0:

import air.net.*;

Monitorowanie połączeń HTTP

Klasa URLMonitor określa, czy możliwe jest wysyłanie żądań HTTP do określonego adresu na port 80 (typowy port używany w komunikacji HTTP). W poniższym kodzie użyto instancji klasy URLMonitor w celu wykrywania zmian w łączności z witryną firmy 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); 
}

Monitorowanie gniazd

Aplikacje AIR mogą także używać połączeń z gniazdami do realizacji łączności w modelu aktywnym (ang. push). Zapory i routery sieciowe zazwyczaj ze względów bezpieczeństwa uniemożliwiają komunikację sieciową przez nieupoważnione porty. Dlatego programiści muszą brać pod uwagę fakt, że użytkownik nie zawsze może nawiązać połączenie przez gniazdo.

W poniższym kodzie użyto instancji klasy SocketMonitor w celu wykrywania zmian w połączeniu z gniazdem. Monitorowany jest port 6667 — używany zwykle dla protokołu 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); 
} 

Jeżeli serwer gniazda wymaga bezpiecznego połączenia, można użyć klasy SecureSocketMonitor zamiast klasy SocketMonitor.

Rekordy usługi DNS (Domain Name System)

Klasa DNSResolver umożliwia wyszukiwanie rekordów zasobów DNS. Rekordy DNS zawierają takie informacje, jak adres IP przypisany do nazwy domeny oraz nazwa domeny przypisana do adresu IP. Istnieje możliwość wyszukiwania następujących typów rekordów zasobów DNS:

  • ARecord — adres IPv4 hosta.

  • AAAARecord — adres IPv6 hosta.

  • MXRecord — rekord usługi wymiany poczty dla hosta.

  • PTRRecord — nazwa hosta przypisana do danego adresu IP.

  • SRVRecord — rekord usługi..

Aby wyszukać rekord, należy przekazać ciąg znaków zapytania i obiekt klasy reprezentujący typ rekordu do metody lookup() obiektu DNSResolver. Ciąg znaków zapytania powinien odpowiadać typowy rekord:

Klasa rekordu

Ciąg znaków zapytania

Przykładowy ciąg znaków zapytania

ARecord

nazwa hosta

"example.com"

AAAARecord

nazwa hosta

"example.com"

MXRecord

nazwa hosta

"example.com"

PTRRecord

adres IP

"208.77.188.166"

SRVRecord

Identyfikator usługi: _service._protocol.host

"_sip._tcp.example.com"

Poniższy przykładowy kod wyszukuje adres IP hosta "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 ); 
        } 
    } 
}

Aby znaleźć więcej informacji na ten temat, zobacz: