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>