Adobe® AIR® 提供了一种方法,可以检查安装 AIR 应用程序的计算机的网络连接是否发生更改。如果应用程序使用的数据是从网络获取的,则此信息非常有用。而且,应用程序可以检查网络服务的可用性。
检测网络连接更改
AIR 应用程序可以在具有不确定且不断更改的网络连接的环境中运行。为了有助于应用程序管理到在线资源的连接,每当网络连接变为可用或不可用时 Adobe AIR 都会发送一个网络更改事件。应用程序的 NativeApplication 对象会调度该网络更改事件。为了响应该事件,可添加一个侦听器:
NativeApplication.nativeApplication.addEventListener(Event.NETWORK_CHANGE, onNetworkChange);
并定义一个事件处理函数:
function onNetworkChange(event:Event) { //Check resource availability }
Event.NETWORK_CHANGE 事件不是指示所有网络活动的更改,而是仅指示网络连接已更改。AIR 不尝试解释网络更改的含义。联网的计算机可能有许多真实和虚拟的连接,因此失去某个连接并不一定意味着失去了资源。而另一方面,新建连接也无法保证改善资源的可用性。有时,新建连接甚至可能阻止对之前可用资源的访问(例如,连接到 VPN 时)。
通常,应用程序确定其是否可连接到远程资源的唯一方法是,尝试连接该远程资源。为此,air.net 包中的服务监视框架为 AIR 应用程序提供了一个基于事件的方法,该方法可响应到指定主机的网络连接的更改。
服务监视基础知识
服务监视器框架独立于 AIR 框架并位于 servicemonitor.swc 文件中。为了使用该框架,servicemonitor.swc 文件必须包含在构建过程中。
import air.net.*;
在 Adobe® Flash® CS4 Professional 中使用这些类:
-
选择“文件”>“发布设置”命令。
-
单击 ActionScript 3.0 的“设置”按钮。选择“库路径”。
-
单击“浏览到 SWC”按钮,从而浏览到 Adobe Flash CS4/AIK1.1/frameworks/libs/air/servicemoniter.swc。
-
单击“确定”按钮。
-
将下面的 import 语句添加到 ActionScript 3.0 代码中:
import air.net.*;
ServiceMonitor 类实现用于监视网络服务的框架并为服务监视器提供基本功能。默认情况下,ServiceMonitor 类的实例会调度有关网络连接的事件。在创建该实例后以及每当 Adobe AIR 检测到网络更改时,ServiceMonitor 对象会调度这些事件。此外,可以设置 ServiceMonitor 实例的 pollInterval 属性进而以指定的间隔(以毫秒为单位)检查连接,而不考虑一般的网络连接事件。直到调用 start() 方法时,ServiceMonitor 对象才检查网络连接。
URLMonitor 类(ServiceMonitor 类的子类)可检测针对指定的 URLRequest 的 HTTP 连接的更改。
SocketMonitor 类(也是 ServiceMonitor 类的子类)可在指定的端口检测到指定主机的连接的更改。
检测 HTTP 连接
URLMonitor 类确定是否可从端口 80(HTTP 通信的标准端口)向指定地址发送 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.adobe.com')); monitor.addEventListener(StatusEvent.STATUS, announceStatus); monitor.start(); function announceStatus(e:StatusEvent):void { trace("Status change. Current status: " + monitor.available); }
检测套接字连接
AIR 应用程序也可将套接字连接用于推模式连接。防火墙和网络路由器通常会因某些安全原因而对未授权端口上的网络通信进行限制。因此,开发人员必须考虑用户可能不具有建立套接字连接能力。
类似于 URLMonitor 示例,以下代码使用 SocketMonitor 类的实例在 6667(IRC 的常用端口)处检测套接字连接的连接更改:
import air.net.ServiceMonitor; import flash.events.StatusEvent; socketMonitor = new SocketMonitor('www.adobe.com',6667); socketMonitor.addEventListener(StatusEvent.STATUS, socketStatusChange); socketMonitor.start(); function announceStatus(e:StatusEvent):void { trace("Status change. Current status: " + socketMonitor.available); }