Luar's Flash Playground:你需要Flash Remoting嗎?
你需要Flash Remoting嗎? (24-06-2003)

Flash MX推出後,Macromedia積極推出很多和Flash有關的產品,有DRK、Flash Remoting、FlashCom、Data Connecton Kit,即將來臨還有Central和Royale……其中最令一般Flash玩家疑惑的是Flash Remoting和Data Connecton Kit,究竟他們有什麼用?兩者有什麼分別?我只用過Flash Remoting,所以只能夠先談一談Flash Remoting有何用途。

簡單地說,兩者都是用來使Flash和Server更容易交換Data,查詢Database等,因此如果只是用Flash來製作動畫、單機小遊戲、演示介面,不接觸Server的工作,就不需要Flash Remoting和DCK。

背景資料
自Flash 4開始,Flash可以連接Server來交換Data,方法是利用loadVariable()連接Middleware,即Server-side Program,亦即ASP、PHP等,Flash用GET和POST傳Data給Middleware,和傳統HTML Form一樣。Middleware則以URL-encoded格式傳回給Flash,即print、echo、response.write(Sytnax視乎用什麼Server-side Program)一句String出來,例如:

myName=luar&place=hong+kong

loadVariable()的缺點是Variable只可以一個一個地傳,而且Flash將收到Variable的Data Type全部認為是String(數字也不例外)。如果要傳一系列的Variables,只有:

var1=123&var2=456&var3=789...

或者:

var=123|456|789...

然後再自己拆開,Flash 4沒有Array和split(),這是一個甚痛苦工作。遇上Dynamic數量的Variables,還要靠Middleware傳多一個varTotal=10來代表Variable總數,方便拆開Data。

Flash 5支持Array和split(),對傳一系列的Variables,可以方便地用split()拆成Array,不過split()拆大量Data時速度很慢,那時Branden Hall寫了string.as優化split()執行速度。

loadVariable()另一個問題就是非同步延誤,Flash完全不知道Data究竟何時已經load入來,因此新手經常loadVariable()後立即調用那Variable而引致問題,解決方法就是在傳回那個String頭尾加上bof=1和eof=1,例如:

bof=1&myName=luar&place=hong+kong&eof=1

然後用兩格Frame不停循環播放,檢查bof和eof是否等於1,例如:

[Frame 1]
loadVariable("var.php", 0);

[Frame 2]
if (bof==1 and eof==1){
    gotoAndPlay(4);
}

[Frame 3]
gotoAndPlay(2);

[Frame 4]
trace ("Data is loaded!");

XML時代
當要傳大量相關數據,類似Database Table欄目Recordset時,利用拆成Array方法始終不便,幸好Flash 5開始支持XML,使傳入來的Data可以更有系統,例如:

<record>
  <item>
    <name>luar</name>
    <place>hong kong</place>
  </item>
  <item>
    <name>kelly</name>
    <place>kowloon</place>
  </item>
</record>

XML.onload更使Flash知道Data已經load入來,可以開始進行XML Parsing,意思是將XML中Data轉為Flash可以運用的Data Type,通常都是轉成Array,不過XML Parsing轉成Array,Array Element的Data Type都是只有String。

Flash 5處理XML的速度很慢,廣為人詬病,遇著大量Data,例如10k或以上,XML Parsing甚至會拖垮Flash Player,那時Branden Hall寫了XMLNitro優化XML Parsing執行速度。不過,有時寧願用回loadVariable和拆Array方法,更簡單、方便和快捷。

Flash 6新面貌
Flash Player 6執行Flash 5/6文件時,拆Array和XML Parsing的速度改善了很多很多,不過Data Type依舊是String,針對loadVariable()非同步延誤缺點,Flash 6加入了LoadVars Object,用它來處理和Server交換Data的工作,方便很多,LoadVars.onLoad更使Flash知道Data已經load入來。

XML Socket
Flash 5另外加入了XML Socket,其實通過是Server運行著的Socket Server,主動Push Data給Flash,這主要用來做Multiuser應用,或者股票即時報價等。Macromedia沒有出品Socket Server,要自己寫一個,或者使用其他人寫的Socket Server(例如:UnityElectroServer等),Socket Server要一直運行著,隨時接收Data。普通Hosting未必可以讓人Run Server,而且在Flash和Server交換Data上要再靠Socket Server,一般都很少會用在日常開發工作中。

Flash Remoting
交待了一大堆背景資料,就是想說Flash Remoting是針對以上問題而生的技術,我認為Flash Remoting最主要功能有2個:與Server直接交換不同Data Type,連接Remote Services。

從Server傳到Flash的Data的Data Type是String,同樣從Flash傳到Server的Data的Data Type都是String,Flash Remoting可以直接將Number、Boolean、Array等在Flash和Server間互相傳遞,這可以減少Client和Server兩端在Data Type轉換上的工作量。例如Server可以將Data直接以Array傳給Flash,Flash可以立即使用,很方便;甚至整個Recordset傳給Flash,配合Data Grid顯示出來。另外,最重要是Flash中使用Flash Remoting的ActionScript是NetServices,它有兩種狀態_Status和_Result。_Status用來處理Exception,例如傳遞失敗等情況,_Result用來處理成功傳送情況。因此在Data傳遞上,Flash Remoting可以使Flash完全掌握整個過程。

第2個功能我認為影響更深遠,因為它使Flash和網絡技術大趨勢Web Services接上。在沒有XML之前,數據格式是各自為政,不同技術、生產商是不同,就算現實工作上,在同一公司,不同部門製作的程序,處理、儲存或輸出格式都是不同,因此在Data互通上做成很大麻煩,要使用人家的Data,就要先寫一個解讀程序。但是有了XML後,加上SOAP通訊協議,不同程序可以用XML來交換Data。換句話說,程序輸出結果是XML格式,其他程序可以「明白」它。Internet是最大交換Data的平台,Web Services就是遠端電腦中程序,其他電腦可以連接使用。

Web Services的影響
再簡單地說,Flash Remoting使Flash能連接自己Domain以外的地方,傳遞Data,突破本身Sandbox的安全限制。平日開發的以Flash作介面的Web Based應用,Server傳來的Data(URL-encoded格式),基本上針對Flash而度身訂做的,就算是XML,為了減少XML Parsing負荷,XML都是精簡到只有Data,別的程序用不著這些Data,就是浪費了開發時間和資源,減低交換Data的能力,換了Web Based程序以Web Services形式開發,Flash可以通過Flash Remoting使用,其他程序都可以用WSDL知道怎去使用,正正是現今資訊要流通,開發程序要有更大可重用性和擴充能力的大趨勢。

總結
當知道所開發的程序是怎樣定位,對於Flash和Server間Data交換有何要求時,或者就會明白是否需要Flash Remoting。作為一個單一ActionScripter,只會寫ActionScript,沒有Server-side編程能力,基本上很難會用上Flash Remoting,因為Flash Remoting在Flash那邊很簡單,只要連上負責Flash Remoting的Gateway,指出要什麼Service,等候接收Data便可,Server-side編程才是技巧之所在,所以要成為一個全面Flash Developer,應要學習一種Server-side Program旁身,可以選ColdFusion、ASP.NET或者PHP等。

本文章由發表。
意見
"; print "沒有意見。
 "; } ?>
  • 不錯,luar,如果你真能取到DCK和它的Firefly組件的測試版的話,發一分到我的email(不過我想沒有什麼可能,它是不會有測試版的),先謝了。

    由pokerface於24-06-2003發表

  • Why can't show simplified Chinese?
    luar, if you get the trial version of DCK and it's firefly by chance( though i think it will not likely to have it's trail), would you please send a copy to my email.
    Thanks in advance.

    由pokerface於24-06-2003發表

  • 如果能用個圖例表達它們之間的關係是再好不過的了,因為對初學者來說比較抽像。
    不過還是要感謝你給我們帶來的好文章,這正是我在FLASH迷茫中所需要的。

    由sun於01-07-2003發表

  • 非常高興能看到你的這篇文章,LUAR.:D
    我從你這里得到了充分的信息,因為以前一直搞不明白,FLASH REMOTING倒底有什麼大的用處,因為我覺得本來就可以用XML和LOADVARIABLE來得到數據庫中的內容。現在終于了解清楚了,感謝你的文章,以後還要多向你請教

    billyqiu於22-07-2003發表

  • 談談和JAVA&JSP的聯系吧。

    由kunmao於10-09-2003發表

  • 不錯!!

    由daizi於03-12-2003發表

  • 你的態度讓我吃驚!
    收集了好多資料,謝謝!

    yuni於17-02-2004發表

  • 很好的文章,最近按了flashcom,听雲開說了remoting,所以過來看看。只會些簡單的asp,看來學起來是個堅難的選擇!想請問一下,flashcom于flash傳送數據必須用remoting嘛?

    由幻鯊於09-04-2004發表

  • 谢谢

    由J.P於19-04-2004發表

同組文章