網路作業與通訊的基本概念

Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本

當您在 Flash Player 或 AIR 中建置應用程式時,通常需要存取應用程式外部的資源。例如,您可能會將影像的要求傳送至網際網路網站伺服器,接著取得影像資料。您也可能會透過通訊端連線,與應用程式伺服器來回傳送經過序列化的物件。Flash Player 和 AIR API 提供多種類別,讓您的應用程式參與這項交換。這些 API 支援通訊協定 (例如 UDP、TCP、HTTP、RTMP 和 RTMFP) 的 IP 型網路。

下列類別可以用於跨網路傳送和接收資料:

類別

支援的資料格式

通訊協定

說明

Loader

SWF、PNG、JPEG、GIF

HTTP、HTTPS

載入支援的資料類型,以及將資料轉換為顯示物件。

請參閱以動態方式載入顯示內容

URLLoader

任意 (文字、XML、二進位等)

HTTP、HTTPS

載入任意格式的資料。您的應用程式負責解譯資料。

請參閱使用 URLLoader 類別

FileReference

Any

HTTP

上傳和下載檔案。

請參閱使用 FileReference 類別

NetConnection

視訊、音效、ActionScript 訊息格式 (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)

通常,建立網路應用程式時,儲存使用者應用程式狀態的永續性資訊十分有幫助。基於此用途,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 位址)。請參閱Network 介面

  • DNSResolver:可讓您查詢 DNS 記錄。請參閱網域名稱系統 (DNS) 記錄

  • ServiceMonitor:可讓您監視伺服器的可用性。請參閱服務監視

  • URLMonitor:可讓您監視特定 URL 資源的可用性。請參閱 HTTP 監視

  • SocketMonitor 和 SecureSocketMonitor:可讓您監視通訊端上資源的可用性。請參閱Socket 監視

重要概念與術語

下列參考清單包含撰寫網路與通訊程式碼時會遇到的相關重要術語:

外部資料
以某種形式儲存於 應用程式之外的資料,在需要時載入應用程式之中。這種資料可能存放在可以直接載入的檔案中,或是存放在資料庫或是其它可藉由呼叫指令碼或是伺服器上執行的程式來擷取的形式。

URL 編碼變數
URL 編碼格式提供以單一文字字串代表多個變數 (變數名稱/數值配對) 的方式。個別的變數則以 name=value 的格式來撰寫。每個變數 (也就是,每個名稱/數值配對) 都會以 & 字元來分隔,如下所示:variable1=value1&variable2=value2。這樣一來,所傳送的單一訊息中就可包含無限的變數數量。

MIME 類型
在網際網路通訊中,用來識別特定檔案類型的標準程式碼。任何特定的檔案類型都會有用來識別其類型的特定程式碼。當您傳送檔案或訊息時,電腦 (例如網頁瀏覽器或使用者的 Flash Player 或 AIR 實體) 將指定要傳送的檔案類型。

HTTP
超文字傳輸通訊協定,這是一種標準格式,用來傳遞網頁並透過網際網路傳送各種不同類型的內容。

要求方法
當 AIR 應用程式或網頁瀏覽器之類的應用程式傳送訊息 (稱為 HTTP 要求) 給網站伺服器時,任何傳送的資料都可以用兩種方式之一內嵌到要求中;這兩種「要求方法」就是 GET 和 POST。在伺服器端,負責接收要求的程式需要在適當的要求區段中找到此資料,因此用來將資料從您的應用程式傳送出去的要求方法,必須與伺服器用來讀取資料的要求方法相符。

通訊端連線
兩個電腦之間通訊的持續連線。

上傳
將檔案傳送至另一部電腦。

下載
從另一部電腦擷取檔案。

Network 介面

您可以使用 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 時)。

一般而言,應用程式若要判斷自己是否能連接遠端資源,唯一的方法就是嘗試連接該資源。服務監視架構提供以事件為基礎的方式,來回應特定主機的網路連線變更。

備註: 服務監視架構會偵測伺服器是否會以可接受的方式回應要求。檢查成功並不保證連線功能全部正常。可調整的網路服務通常會使用快取和載入平衡設備,將流量重新導向至網站伺服器的叢集。在這種情況下,服務提供者只會提供部分網路連線診斷。

服務監視

服務監視架構 (與 AIR 架構不同) 位於 aircore.swc 檔案中。若要使用這個架構,您必須將 aircore.swc 檔案包含在建置程序中。

Adobe® Flash® Builder 會自動包含這個程式庫。

ServiceMonitor 類別會實作這個架構以監視網路服務,並且為服務監視器提供基本功能。根據預設,不管網路連線狀態為何,ServiceMonitor 類別的實體都會傳送事件。當建立實體以及執行階段偵測到網路變更時,ServiceMonitor 物件會傳送這些事件。此外,不管一般的網路連線事件為何,您都可以設定 ServiceMonitor 實體的 pollInterval 屬性,根據指定的時間間隔 (以毫秒為單位) 定期檢查連線。直到呼叫 start() 方法之前,ServiceMonitor 物件都不會檢查網路連線。

URLMonitor 是 ServiceMonitor 類別的子類別,可以針對指定的 URLRequest,偵測 HTTP 連線中的變更。

SocketMonitor 也是 ServiceMonitor 類別的子類別,可以偵測透過指定的連接埠,連接至指定之主機的連線中之變更。

備註: 在 AIR 2 之前,服務監視架構是發佈於 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 組件從「組件」面板拖曳至「元件庫」。然後在 ActionScript 3.0 程式碼中加入下列 import 陳述式:

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

Socket 監視

AIR 應用程式也可以針對推入模型 (Push-Model) 連線,使用通訊端連線。防火牆和網路路由器通常都會基於安全性因素,限制透過未授權的連接埠進行網路通訊。因此,開發人員必須考慮到使用者並無法全天候建立通訊端連線。

下列程式碼會使用 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

服務 ID: _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 ); 
        } 
    } 
}

如需詳細資訊,請參閱: