2008年12月13日
【作品】讓網頁裡的多個Flash互相通訊 (使用LocalConnection)
LocalConnection類別,可以在Flash檔之間傳遞訊息,只是功能有所限制,傳送是單向的,一方傳送一方接收,若要雙向溝通,需同時建立二個管道,範例與使用方式可以看官方的教學:
An example of communication between SWF files using LocalConnectionLocalConnection類別的設計是要指定接收端(client),但是不能夠有多個client同時接收訊息,只有一個會收到,所以一旦檔案超過2個,情況就會變得十分複雜。因此在此撰寫了一個可以進行廣播的類別,原理如下:
- 一開始所有的程式嘗試連接同一通道
- 由搶到client權的程式收集所有程式的唯一ID
- 將ID列表傳送至每一個參與程式,並依照每一個ID建立獨立通道
- 每一個程式都取得其它程式的通道資訊,可以開始進行廣播
Flash間互相通訊有什麼用處?下面是實際的多方"通訊"範例
Alice和Bob是通訊裡常用的兩個名字,在這邊是使用參數傳遞到檔案裡(如何傳遞參數?),除此之外,這三個其實是一模一樣的檔案。
Mallory則是攻擊者,不過在這裡大家可以儘情聊天。
[範例原始檔下載] (需搭配類別檔使用)
Alice和Bob是通訊裡常用的兩個名字,在這邊是使用參數傳遞到檔案裡(如何傳遞參數?),除此之外,這三個其實是一模一樣的檔案。
Mallory則是攻擊者,不過在這裡大家可以儘情聊天。
[範例原始檔下載] (需搭配類別檔使用)
訊息內容只會在本機端傳送,其實不會有人這麼無聊自己和自己聊天,那麼還可以做什麼呢?有些情況使用者並不希望離開或重新整理該頁面時,就派得上用場了,例如遊戲、網站、互動式廣告,像玩Flash小遊戲時,有時達到某些遊戲目標時,需要執行某些動作;網站在做佈景預覽時,如果有一些Flash是佈景的一部份,互相傳遞一下就可以一起換色;多個廣告可以進行互動又不會影響到頁面…等,發揮一下創意或許還會有更多應用。
類別檔的使用:
// 類別檔需置於classpath裡
// 按照檔案路徑: tw/broadcast/Broadcaster.as
import tw.broadcast.Broadcaster;
// UniqueID可以用亂數、檔名或指定名稱,總之要唯一值
// 可以指定第二個參數字串,用以區別同一網頁裡的不同"群"
var broadcaster:Broadcaster = new Broadcaster(UniqueID);
// text可以是字串、陣列…等Object的繼承者
// 注意剛建立時馬上廣播可能會收不到,因為其它程式尚未加入
broadcaster.broadcast(text);
// someMethod用來處理接收到的訊息
broadcaster.addEventListener("received", someMethod);
開發時遇到的一些困難,主要是Error的catch,LocalConnection的send()動作,還會丟出StatusEvent.STATUS或SecurityErrorEvent.SECURITY_ERROR事件,來代表傳送是否成功,不處理的話編譯後會顯示錯誤。
引用URL
http://cgi.blog.roodo.com/trackback/7848417