網絡和通信基礎知識


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM