网络和通信基础知识

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

在 Flash Player 或 AIR 中构建应用程序时,经常需要访问应用程序之外的资源。例如,您可能会向 Internet Web 服务器发送图像请求并因而获得图像数据。或者,您可能使用应用程序服务器的套接字连接反复发送序列化对象。Flash Player 和 AIR API 提供了几个类,使您的应用程序可以参与这种交换。这些 API 支持基于 IP 的网络使用 UDP、TCP、HTTP、RTMP 和 RTMFP 等协议。

下列类可以用于通过网络发送和接收数据:

支持的数据格式

协议

说明

Loader

SWF、PNG、JPEG、GIF

HTTP、HTTPS

加载支持的数据类型并将数据转换为显示对象。

请参阅动态加载显示内容

URLLoader

任意格式(文本、XML、二进制等)

HTTP、HTTPS

加载任意格式的数据。您的应用程序负责解释数据。

请参阅使用 URLLoader 类

FileReference

Any

HTTP

上载和下载文件。

请参阅使用 FileReference 类

NetConnection

视频、音频、ActionScript Message Format (AMF)

HTTP、HTTPS、RTMP、RTMFP

连接到视频、音频和远程对象流。

请参阅使用视频

Sound

音频

HTTP

加载并播放支持的音频格式。

请参阅加载外部声音文件

XMLSocket

XML

TCP

与 XMLSocket 服务器交换 XML 消息。

请参阅 XML 套接字

Socket

Any

TCP

连接到 TCP 套接字服务器。

请参阅二进制客户端套接字

SecureSocket (AIR)

Any

带有 SSLv3 或 TLSv1 的TCP

连接到要求 SSL 或 TLS 安全的 TCP 套接字服务器。

请参阅安全客户端套接字 (AIR)

ServerSocket (AIR)

Any

TCP

用作传入 TCP 套接字连接的服务器。

请参阅服务器套接字

DatagramSocket (AIR)

Any

UDP

发送和接收 UDP 包。

请参阅 UDP 套接字 (AIR)

通常,在创建 Web 应用程序时,存储有关用户的应用程序状态的永久信息很有帮助。HTML 页和应用程序通常使用 Cookie 来实现此目的。在 Flash Player 中,您可以将 SharedObject 类用于相同的目的。请参阅共享对象。(SharedObject 类可以在 AIR 应用程序中使用,但在仅将数据保存到常规文件时的限制更少。)

如果 Flash Player 或 AIR 应用程序需要与相同计算机上的其他 Flash Player 或 AIR 应用程序进行通信,则可以使用 LocalConnection 类。例如,相同网页上的两个或更多 SWF 可以彼此通信。同样,在网页上运行的 SWF 可以与 AIR 应用程序通信。请参阅与其他 Flash Player 和 AIR 实例通信

如果需要与本地计算机上其他非 SWF 进程通信,则可以使用 AIR 2 中添加的 NativeProcess 类。NativeProcess 类可以使 AIR 应用程序启动并与其他应用程序通信。请参阅与 AIR 中的本机进程通信

如果需要有关运行 AIR 应用程序的计算机的网络环境的信息,可以使用下列类:

  • NetworkInfo — 提供有关可用网络接口的信息,例如计算机的 IP 地址。请参阅网络接口

  • DNSResolver — 使您可以查找 DNS 记录。请参阅域名系统 (DNS) 记录

  • ServiceMonitor — 使您可以监控服务器的可用性。请参阅服务监控

  • URLMonitor — 使您可以监控特定 URL 中的资源的可用性。请参阅 HTTP 监控

  • SocketMonitor 和 SecureSocketMonitor — 使您可以监控套接字中的资源的可用性。请参阅套接字监控

重要概念和术语

以下参考列表包含进行网络和通信代码编程时会遇到的重要术语:

外部数据
在应用程序外部以某些形式存储的数据,需要时可加载到应用程序中。可以将此数据存储在直接加载的文件中,也可存储在数据库中,还可采用可通过调用服务器上所运行的脚本或程序进行检索的其他形式存储。

URL 编码变量
URL 编码格式提供了一种在单个文本字符串中表示多个变量(变量名和值对)的方法。各变量采用 name=value 格式书写。各个变量(即各个名称-值对)之间用 & 符隔开,如下所示:variable1=value1&variable2=value2。这样,便可以将不限数量的变量作为一条消息进行发送。

MIME 类型
用于在 Internet 通信中标识给定文件类型的标准代码。任何给定文件类型都具有用于对其进行标识的特定代码。发送文件或消息时,计算机(如 Web 服务器或用户的 Flash Player 或 AIR 实例)将指定要发送的文件类型。

HTTP
超文本传输协议,这是一种标准格式,用于传送通过 Internet 发送的网页和其他各种类型的内容。

请求方法
应用程序(例如 AIR 应用程序或 Web 浏览器)将消息(称为 HTTP 请求)发送到 Web 服务器时,发送的任何数据都可以使用以下两种方法之一嵌入到请求中 — 这两种请求方法是 GET 和 POST。在服务器端,接收请求的程序需要查看相应的请求部分以查找数据,因此用于从您的应用程序发送数据的请求方法应与用于在服务器上读取该数据的请求方法匹配。

套接字连接
用于在两台计算机之间进行通信的永久连接。

上载
将文件发送到另一台计算机。

下载
从另一台计算机检索文件。

网络接口

可以使用 NetworkInfo 对象了解您的应用程序可以使用的硬件和软件网络接口。NetworkInfo 对象是 singleton 对象,无需您创建。您可以使用静态类属性 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 时)。

通常,应用程序确定其是否可连接到远程资源的唯一方法是,尝试连接该远程资源。服务监控框架提供了一种基于事件的方式来响应对指定主机的网络连接的更改。

注: 服务监控框架会检测服务器是否对请求进行接受响应。成功地进行检查并不能保证完全连接。通常,可扩展的 Web 服务使用缓存和负载平衡设备将流量重定向到 Web 服务器群集。在这种情况下,服务提供商仅提供对网络连接的局部诊断。

服务监控

服务监视器框架独立于 AIR 框架并位于 aircore.swc 文件中。要使用该框架,aircore.swc 文件必须包含在构建过程中。

Adobe® Flash® Builder 自动包括此库。

ServiceMonitor 类实现用于监视网络服务的框架并为服务监视器提供基本功能。默认情况下,ServiceMonitor 类的实例会调度有关网络连接的事件。在创建实例或运行时检测到网络更改时,ServiceMonitor 对象会调度这些事件。此外,可以设置 ServiceMonitor 实例的 pollInterval 属性进而以指定的间隔(以毫秒为单位)检查连接,而不考虑一般的网络连接事件。在调用 start() 方法之前,ServiceMonitor 对象不检查网络连接。

URLMonitor 类(ServiceMonitor 类的子类)可检测针对指定的 URLRequest 的 HTTP 连接的更改。

SocketMonitor 类(也是 ServiceMonitor 类的子类)可在指定的端口检测到指定主机的连接的更改。

注: 对于 AIR 2 之前的 AIR 版本,服务监视器框架是在 servicemonitor.swc 库中发布的。此库目前已弃用。请改用 aircore.swc 库。

Flash CS4 和 CS5 Professional

在 Adobe® Flash® CS4 或 CS5 Professional 中使用这些类:

  1. 选择“文件”>“发布设置”命令。

  2. 单击 ActionScript 3.0 的“设置”按钮。选择“库路径”。

  3. 单击“浏览到 SWC”按钮并浏览到 Flash Professional 安装文件夹中的 AIK 文件夹。

  4. 在此文件夹中,找到 /frameworks/libs/air/aircore.swc(对于 AIR 2)或 /frameworks/libs/air/servicemonitor.swc(对于 AIR 1.5)。

  5. 单击“确定”按钮。

  6. 将下面的 import 语句添加到 ActionScript 3.0 代码中:
    import air.net.*;

Flash CS3 Professional

要在 Adobe® Flash® CS3 Professional 中使用这些类,请将 ServiceMonitorShim 组件从“组件”面板拖动到“库”中。然后,将以下 import 语句添加到 ActionScript 3.0 代码中:

import air.net.*;

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

如果套接字服务器需要安全连接,则可以使用 SecureSocketMonitor 类而不是 SocketMonitor。

域名系统 (DNS) 记录

使用 DNSResolver 类,您可以查找 DNS 资源记录。DNS 资源记录提供了域名的 IP 地址和 IP 地址的域名等信息。可以查找以下类型的 DNS 资源记录:

  • ARecord — 主机的 IPv4 地址。

  • AAAARecord — 主机的 IPv6 地址。

  • MXRecord — 主机的邮件交换记录。

  • PTRRecord — IP 地址的主机名。

  • SRVRecord — 服务的服务记录。。

要查找记录,您可将查询字符串和表示记录类型的类对象传递给 DNSResolver 对象的 lookup() 方法。要使用的查询字符串取决于记录类型:

记录类

查询字符串

查询字符串示例

ARecord

主机名

“example.com”

AAAARecord

主机名

“example.com”

MXRecord

主机名

“example.com”

PTRRecord

IP 地址

“208.77.188.166”

SRVRecord

服务标识符:_service._protocol.host

“_sip._tcp.example.com”

以下代码示例查找主机“example.com”的 IP 地址。

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

有关详细信息,请参阅: