FLEX SharedObject介紹及應用

ShareObject介紹:

1 ShareObject,顧名思義共享對象,而通常意義上的共享,從B/S結構上來講,無非是客戶端(瀏覽器端)的共享和服務器端的共享了,不錯,ShareObject剛好份演了這兩種角色。而且ShareObject也是按此進行了兩種分類,一類是LSO——Local Share Object(本地共享對象)其實類似於cookie,而另一種RSO——Remote Share Object(遠程共享對象我感覺比較類似於JSP中的Application對象,但好象比Application更強大。

2.存儲位置 
以 Windows爲例,目錄爲 
C:\Documents and Settings\[ username ] \\Application Data\\Macromedia\\Flash 
Player\\#SharedObjects\\ [ random character directory name ] , 在Mac OS X 上, 目錄爲 
/Users/[ username ] /Library/Preferences/Macromedia/Flash Player/#SharedObject/ [ random 
character directory name ]。隨機字符目錄命名是爲了安全考慮 

下面我分別用實例代碼來說兩者的用法和用途:

一:LSO(本地共享對象)

LSO的用法比較簡單,和我們平常操作Cookie大同小異:

1.得到一個共享對象:

var so:SharedObject=SharedObject.getLocal("mydata","/");

2.往共享對象裏存入值:

var user:Object=new Object();

              user.userName=userName.text;

              user.passWord=passWord.text;

              user.isSaveLogin=(remember.selected==true?1:0);

              so.data.user=user;

3.清除共享對象裏的值:

       var so:SharedObject=SharedObject.getLocal("mydata","/");

                            if(so.data.user!=null){

                                   so.data.user=null;

                            }

4.讀取共享對象裏的值:

       var so:SharedObject=SharedObject.getLocal("mydata","/");

                            if(so.data.user!=null){

                                   userName.text=so.data.user.userName;

                                   passWord.text=so.data.user.passWord;

                                   if(so.data.user.isSaveLogin.toString()=="1"){

                                          remember.selected=true;

                                   }

 

二:RSO(遠程共享對象):

 RSO是服務器端的共享對象,服務器端的數據共享可以實現多個客戶端數據共享,在這裏服務器我採用Flash Media Server3,FMS的使用非常簡便,你只要在安裝目錄下找到Applications目錄,並在其下新建一個子目錄就可以成爲你的工程或項目了。關於FMS的使用大家可以參考相關文章,本文不做介紹:利用FMS和RSO我們可以實現非常多的功能,諸如,聊天室,聯機遊戲,視頻會議,在線視頻錄製和視頻聊天。。。。。。

在這裏我用一個簡單的聊天室實例爲例稍做講解:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="TextSO ();">
	<mx:Script>
		<![CDATA[
  		import flash.events.SyncEvent;
  		import flash.events.NetStatusEvent;
  		import flash.events.MouseEvent;
  		import flash.net.SharedObject;
  		import flash.net.NetConnection;
  		
        private var text_so:SharedObject;
        private var nc:NetConnection;
        private var rtmpGo:String;
        private var good:Boolean;

        public function TextSO ():void
        { 
             button.label="Send";
             button.addEventListener (MouseEvent.CLICK,sendMsg);//爲發送按鈕添加發送事件
             rtmpGo = "rtmp://localhost/basicSO";//這裏設置FMS服務器的連接地址,basicSO即爲,
             //FMS安裝目錄下Applications下自己手動新建的一個文件夾名稱,也是FMS的工程名,就是這麼簡潔,不可意議
             nc = new NetConnection( );//產生一個連接對象
             nc.connect (rtmpGo);//連接到上面的地址
             nc.addEventListener (NetStatusEvent.NET_STATUS,doSO);//加入連接的監聽事件,以便根據連接返回的狀態做相應處理
        }

        private function doSO (e:NetStatusEvent):void
        {	
             good=e.info.code == "NetConnection.Connect.Success";//判斷是否爲連接成功狀態
             //連接返回的狀態有好幾種,大家可以參看FMS的文檔,很詳盡
             if (good)//如果連接成軾,執行如下操作
             {
                   text_so=SharedObject.getRemote("test",nc.uri,false);//得到遠程共享對象,false屬性是設置共享的數據爲非持久化的,
                   	//即重啓服務器後,先前的數據不會保存
                   text_so.connect (nc);
                   text_so.addEventListener (SyncEvent.SYNC,checkSO);
                   //爲共享對象添加異步事件,這也是服務器同步處理多客戶端最關鍵的地方,
                   //一個客戶端進行了什麼操作,其它客戶端也會有相應的變化,就是通過此事件來完成的
             }
        }

        private function checkSO (e:SyncEvent):void
        {
             for (var chng:uint; chng<e.changeList.length; chng++)
             {
                   switch (e.changeList[chng].code)
                   {
                        case "clear" :
                             break;

                        case "success" :
                             trace (text_so.data.msg);
                             break;

                        case "change" ://一個客戶端改變數據會更新所有客戶端
                             textArea.htmlText+=text_so.data.msg + "\n";
                             break;
                   }
             }
        }

        private function sendMsg (e:MouseEvent):void
        {
             text_so.setProperty ("msg",textInput.text);//將新的信息存入共享對象
             textArea.htmlText+=text_so.data.msg + "\n";//更新客戶端的信息列表
        }


		]]>
	</mx:Script>
	<mx:VBox>
		<mx:TextArea id="textArea" width="200" height="200"/>//信息列表框
		<mx:TextInput id="textInput"/>//消息輸入框
		<mx:Button id="button" />//發送按鈕
	</mx:VBox>
</mx:Application>



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章