Luar's Flash Playground:你需要Flash Remoting嗎?
新聞(100)
觀點或評論(93)
Flash書(63)
教程(65)
Design Patterns(3)
FlashCom筆記(45)
Flash Remoting筆記(27)
Flex筆記(11)
Flash Lite筆記(14)
PHP資訊(22)
Ajax筆記(9)
習作(47)
組件(15)
酷站(31)
學習資源(28)
書籍推介(15)
本站與我(90)
RSS瀏覽器
聯絡
熱愛鑽研
Ajax
ActionScript
Flash
Flash Lite
Flex
Flash Remoting
FlashCom
Director
Lingo
PHP
Multiplayer Game

搜尋
VCASMO
你需要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等。

本文章由luar發表。
意見
  • 不錯,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發表

同組文章

Movable Type 3.15系統支持,Luar's Production版權所有。