網路作業與通訊的基本概念Flash Player 9 以及更新的版本,Adobe AIR 1.0 以及更新的版本 當您在 Flash Player 或 AIR 中建置應用程式時,通常需要存取應用程式外部的資源。例如,您可能會將影像的要求傳送至網際網路網站伺服器,接著取得影像資料。您也可能會透過通訊端連線,與應用程式伺服器來回傳送經過序列化的物件。Flash Player 和 AIR API 提供多種類別,讓您的應用程式參與這項交換。這些 API 支援通訊協定 (例如 UDP、TCP、HTTP、RTMP 和 RTMFP) 的 IP 型網路。 下列類別可以用於跨網路傳送和接收資料:
通常,建立網路應用程式時,儲存使用者應用程式狀態的永續性資訊十分有幫助。基於此用途,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 應用程式之電腦的網路環境資訊,請使用下列類別:
重要概念與術語下列參考清單包含撰寫網路與通訊程式碼時會遇到的相關重要術語:
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 中使用這些類別:
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 資源:
若要查詢記錄,可以將查詢字串以及代表記錄類型的類別物件,傳送到 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 );
}
}
}
如需詳細資訊,請參閱: |
|