Основные сведения о работе с сетью и обмене данными

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

При создании приложений в проигрывателе Flash Player или среде AIR часто требуется получать доступ к ресурсам вне приложения. Например, можно отправить запрос изображения на веб-сервер в Интернете и в ответ получить данные изображения. Или можно передавать сериализованные объекты туда и обратно по соединению через сокет с сервером приложений. API-интерфейсы Flash Player и AIR предоставляют несколько классов, позволяющих приложениям участвовать в этом обмене данными. Эти API-интерфейсы поддерживают взаимодействие по IP-сети для таких протоколов, как UDP, TCP, HTTP, RTMP и RTMFP.

Следующие классы можно использовать для отправки и получения данных по сети:

Класс

Поддерживаемые форматы данных

Протоколы

Описание

Loader

SWF, PNG, JPEG, GIF

HTTP, HTTPS

Загружает поддерживаемые типы данных и преобразует данные в экранный объект.

См. раздел « Динамическая загрузка содержимого для показа ».

URLLoader

Любой (text, XML, binary и т. д.)

HTTP, HTTPS

Загружает произвольные форматы данных. Приложение отвечает за интерпретацию данных.

См. раздел « Использование класса URLLoader »

FileReference

Любой

HTTP

Отправка и загрузка файлов.

См. раздел « Использование класса FileReference »

NetConnection

Видео, аудио, формат ActionScript Message (AMF)

HTTP, HTTPS, RTMP, RTMFP

Подключает потоки видеоданных, аудиоданных и удаленных объектов.

См. раздел « Работа с видео ».

Sound

Аудио

HTTP

Загружает и воспроизводит поддерживаемые аудиоформаты.

См. раздел « Загрузка внешних звуковых файлов ».

XMLSocket

XML

TCP

Обменивается сообщениями XML с сервером XMLSocket.

См. раздел « XML-сокеты ».

Socket

Любой

TCP

Подключается к сокет-серверу TCP.

См. раздел « Двоичные клиентские сокеты ».

SecureSocket (AIR)

Любой

TCP с шифрованием SSLv3 или TLSv1

Подключается к сокет-серверу TCP, для которого требуется защита шифрованием SSL или TLS.

См. раздел « Безопасные сокеты клиента (AIR) ».

ServerSocket (AIR)

Любой

TCP

Выступает в роли сервера для входящих подключений сокетов TCP.

См. раздел « Сокеты сервера ».

DatagramSocket (AIR)

Любой

UDP

Отправляет и получает пакеты UDP.

См. раздел « UDP-сокеты (AIR) »

Часто при создании веб-приложения полезно сохранять постоянные данные о состоянии приложения пользователя. На страницах и в приложениях HTML для этих целей часто используются файлы cookie. В проигрывателе Flash Player для этого можно использовать класс SharedObject. См. раздел « Общие объекты ». (Класс SharedObject можно использовать в приложениях AIR, но на сохранение данных в обычный файл накладывается меньше ограничений.)

Если приложению Flash Player или AIR требуется обмен данными с другим приложением Flash Player или AIR на одном компьютере, можно воспользоваться классом LocalConnection. Например, два (или более) SWF-файла на одной веб-странице могут обмениваться данными друг с другом. Подобным образом SWF-файл, выполняющийся на веб-странице, может обмениваться данными с приложением AIR. См. раздел « Связь с другими экземплярами Flash Player и AIR ».

Если необходима связь с другими процессами, отличными от SWF-файла, можно использовать класс NativeProcess, добавленный в среду AIR 2. Класс NativeProcess позволяет приложению AIR запускаться и обмениваться данными с другими приложениями. См. раздел « Связь с собственными процессами в AIR ».

Если требуется информация о сетевой среде компьютера, на котором выполняется приложение AIR, можно использовать следующие классы:

Важные понятия и термины

Ниже приводится список важных терминов, встречающихся в этой главе при программировании сетевых приложений и приложений для обмена данными.

Внешние данные
Данные, хранящиеся в какой-либо форме вне приложения и загружаемые в приложение при необходимости. Эти данные могут храниться в файле, который загружается непосредственно, либо в базе данных или иной форме, для доступа к которой требуется выполнение сценариев или программ на сервере.

Переменные, закодированные как URL-адрес
Кодирование в виде URL-адреса позволяет представить несколько переменных (пары имен и значений переменных) в виде одной строки текста. Отдельные переменные записываются в формате name=value. Каждая переменная (т. е. каждая пара «имя-значение») отделяется символом амперсанд: variable1=value1&variable2=value2. Таким образом одним сообщением можно отправить любое количество переменных.

Тип MIME
Стандартный код, предназначенный для определения типа данного файла при связи через Интернет. Тип каждого файла определяется по его специальному коду. При отправке файла или сообщения компьютер (например, веб-сервер или пользовательский экземпляр Flash Player или AIR) указывает тип отправляемого файла.

HTTP
протокол гипертекстовой передачи, стандартный формат для доставки веб-страниц и различных типов содержимого, отправляемого через Интернет.

Метод запроса
Когда программа (например, приложение AIR или веб-обозреватель) отправляет сообщение (так называемый запрос HTTP) веб-серверу, отправляемые данные могут встраиваться в запрос двумя способами — с помощью методов запроса GET и POST. На сервере программа, получающая запрос, должна будет просмотреть соответствующую часть запроса, чтобы найти данные, поэтому метод запроса, используемый для отправки данных из вашего приложения, должен соответствовать методу запроса, используемому для чтения данных на сервере.

Подключение через сокет
Постоянное подключение для осуществления связи между двумя компьютерами.

Отправка
Отправка файла другому компьютеру.

Загрузка
Получение файла с другого компьютера.

Сетевые интерфейсы

Объект NetworkInfo можно использовать для обнаружения аппаратных и программных сетевых интерфейсов, доступных для приложения. Объект NetworkInfo является одиночным объектом, его не требуется создавать. Вместо этого используйте статическое свойство класса, networkInfo , чтобы получить доступ к одиночному объекту NetworkInfo. Объект NetworkInfo также отправляет событие networkChange при изменении одного из доступных интерфейсов.

Вызовите метод findInterfaces() для получения списка объектов NetworkInterface. Каждый объект NetworkInterface в списке описывает один из доступных интерфейсов. Объект NetworkInterface предоставляет такие данные, как IP-адрес, аппаратный адрес, максимальный размер пакета, а также сообщает, активен ли этот интерфейс.

Следующий код отслеживает свойства NetworkInterface для каждого интерфейса на клиентском компьютере.

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

Дополнительные сведения см. в разделе:

Изменения сетевого подключения

Приложение AIR может работать в средах с нестабильными или переменчивыми условиями сетевого подключения. Чтобы приложение могло управлять подключением к интернет-ресурсам, Adobe AIR отправляет событие изменения сетевого состояния, когда подключение становится доступно или наоборот недоступно. Объект NetworkInfo, как и объект приложения NativeApplication, отправляет событие networkChange . Чтобы отвечать на это событие, добавьте прослушиватель:

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

Также нужно определить функцию обработчика события:

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

Событие networkChange говорит не об изменении сетевой активности в целом, а лишь о том, что изменилось отдельное подключение к сети. AIR не предпринимает попыток интерпретировать характер изменения. Компьютер, подключенный к сети, может иметь множество реальных и виртуальных подключений, поэтому разрыв соединения не всегда означат перекрытие доступа к ресурсу. С другой стороны, новые подключения не гарантируют лучшей доступности ресурса. Порой новое соединение может даже заблокировать доступ к ранее доступным ресурсам (например, при подключении к VPN).

В целом, единственным способом определить возможность подключения к удаленному ресурсу является практическая проверка. Инфраструктура мониторинга служб предоставляет основанные на событиях средства для реагирования на изменения сетевых подключений к определенному хосту.

Примечание. Инфраструктура мониторинга служб обнаруживает, отвечает ли сервер должным образом. Успешная проверка не гарантирует полнофункционального подключения. Масштабируемые веб-службы часто используют средства кэширования и распределения нагрузки, перенаправляющие интернет-трафик группе серверов. В такой ситуации поставщики услуг предоставляют лишь частичный диагноз подключения.

Мониторинг служб

Инфраструктура мониторинга служб, отдельно от инфраструктуры AIR, содержится в файле aircore.swc. Чтобы использовать инфраструктуру, файл aircore.swc необходимо включить в процесс сборки.

Adobe® Flash® Builder автоматически включает эту библиотеку.

Класс ServiceMonitor реализует инфраструктуру для мониторинга сетевых служб и обеспечивает основную функциональность для его осуществления. По умолчанию экземпляр класса ServiceMonitor отправляет события, связанные с сетевым подключением. Объект ServiceMonitor отправляет эти события при создании экземпляра и каждый раз, когда среда выполнения обнаруживает изменение в сети. Кроме того, свойство pollInterval экземпляра ServiceMonitor можно настроить для проверки подключения через заданные интервалы в миллисекундах, в дополнение к общим событиям подключения. Объект ServiceMonitor не проверяет подключения по сети, пока не будет вызван метод start() .

Класс URLMonitor, подкласс класса ServiceMonitor, обнаруживает изменения подключения по HTTP-протоколу для конкретных запросов URLRequest.

Класс SocketMonitor, также подкласс класса ServiceMonitor, обнаруживает изменения подключения к тому или иному хосту или порту.

Примечание. В AIR до версии 2 инфраструктура мониторинга служб была опубликована в библиотеке servicemonitor.swc. Теперь эта библиотека не используется. Вместо нее следует использовать библиотеку aircore.swc.

Flash CS4 и CS5 Professional

Порядок использования этих классов в Adobe® Flash® CS4 или CS5 Professional.

  1. Выберите в меню «Файл» команду «Параметры публикации».

  2. Нажмите кнопку «Параметры» для ActionScript 3.0. Выберите «Путь к библиотеке».

  3. Нажмите кнопку «Найти SWC» и откройте папку AIK в каталоге установки Flash Professional.

  4. В этой папке найдите каталог /frameworks/libs/air/aircore.swc (для AIR 2) или /frameworks/libs/air/servicemonitor.swc (для AIR 1.5).

  5. Нажмите кнопку «ОК».

  6. Добавьте следующую инструкцию импорта к своему коду ActionScript 3.0.
    import air.net.*;

Flash CS3 Professional

Для использования этих классов в Adobe® Flash® CS3 Professional перетащите компонент ServiceMonitorShim из панели «Компоненты» в «Библиотеку». Затем добавьте следующую инструкцию import в код ActionScript 3.0.

import air.net.*;

Мониторинг HTTP

Класс URLMonitor определяет, могут ли HTTP-запросы отправляться по заданным адресам на порте 80 (стандартный порт для HTTP-соединений). В коде ниже экземпляр класса URLMonitor используется для определения изменений подключения к сайту 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); 
}

Мониторинг сокетов

Приложения AIR также могут использовать подключения сокетов в рамках пассивных моделей соединений. Брандмауэры и сетевые маршрутизаторы обычно ограничивают сетевые соединения на неавторизованных портах из соображений безопасности. По этой причине разработчикам необходимо учитывать, что у пользователей не всегда есть возможность устанавливать подключения к сокетам.

В коде ниже экземпляр класса SocketMonitor используется для определения изменений подключения к сокету. Осуществляется мониторинг порта 6667, который часто используется для службы 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); 
} 

Если для сокет-сервер требуется защищенное подключение, вместо класса SocketMonitor можно использовать класс SecureSocketMonitor.

Записи системы доменных имен (DNS)

Поиск записей ресурсов DNS можно выполнять с помощью класса DNSResolver. Записи ресурсов DNS предоставляют такую информацию, как IP-адрес доменного имени и доменное имя IP-адреса. Можно выполнять поиск следующих записей ресурсов DNS:

  • ARecord — IPv4-адрес для хоста;

  • AAAARecord — IPv6-адрес для хоста;

  • MXRecord — запись почтового обменника для хоста;

  • PTRRecord — имя хоста для IP-адреса.

  • SRVRecord — запись службы для службы..

Чтобы найти запись, необходимо передать методу lookup() объекта DNSResolver строку запроса и объекта класса, представляющего тип записи. Строка запроса варьируется в зависимости от типа записи.

Класс записи

Строка запроса

Пример строки запроса

ARecord

имя хоста

"example.com"

AAAARecord

имя хоста

"example.com"

MXRecord

имя хоста

"example.com"

PTRRecord

IP-адрес

“208.77.188.166”

SRVRecord

Идентификатор службы: _service._protocol.host

"_sip._tcp.example.com"

Следующий пример выполняет поиск IP-адреса для хоста 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 ); 
        } 
    } 
}

Дополнительные сведения см. в разделе: