网络和通信基础知识Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本 在 Flash Player 或 AIR 中构建应用程序时,经常需要访问应用程序之外的资源。例如,您可能会向 Internet Web 服务器发送图像请求并因而获得图像数据。或者,您可能使用应用程序服务器的套接字连接反复发送序列化对象。Flash Player 和 AIR API 提供了几个类,使您的应用程序可以参与这种交换。这些 API 支持基于 IP 的网络使用 UDP、TCP、HTTP、RTMP 和 RTMFP 等协议。 下列类可以用于通过网络发送和接收数据:
通常,在创建 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 对象了解您的应用程序可以使用的硬件和软件网络接口。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 中使用这些类:
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 资源记录:
要查找记录,您可将查询字符串和表示记录类型的类对象传递给 DNSResolver 对象的 lookup() 方法。要使用的查询字符串取决于记录类型:
以下代码示例查找主机“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 ); } } } 有关详细信息,请参阅: |
|