Основные сведения о работе с сетью и обмене даннымиFlash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий При создании приложений в проигрывателе Flash Player или среде AIR часто требуется получать доступ к ресурсам вне приложения. Например, можно отправить запрос изображения на веб-сервер в Интернете и в ответ получить данные изображения. Или можно передавать сериализованные объекты туда и обратно по соединению через сокет с сервером приложений. API-интерфейсы Flash Player и AIR предоставляют несколько классов, позволяющих приложениям участвовать в этом обмене данными. Эти API-интерфейсы поддерживают взаимодействие по IP-сети для таких протоколов, как UDP, TCP, HTTP, RTMP и RTMFP. Следующие классы можно использовать для отправки и получения данных по сети:
Часто при создании веб-приложения полезно сохранять постоянные данные о состоянии приложения пользователя. На страницах и в приложениях 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, можно использовать следующие классы:
Важные понятия и терминыНиже приводится список важных терминов, встречающихся в этой главе при программировании сетевых приложений и приложений для обмена данными.
Сетевые интерфейсыОбъект 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.
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:
Чтобы найти запись, необходимо передать методу lookup() объекта DNSResolver строку запроса и объекта класса, представляющего тип записи. Строка запроса варьируется в зависимости от типа записи.
Следующий пример выполняет поиск 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 );
}
}
}
Дополнительные сведения см. в разделе: |
|