理解共用對象
共用對象可以儲存任何Flash支援的資料類型。就存放位置來說,共用對象可以分成存在用戶端電腦的本地型,以及存放在伺服器上的遠程型。你可以用它來記錄使用者的相關資訊(如使用者名稱、性別和其它設定參數等),或者用在伺服器端,儲存其它聯機使用者即時分享的資訊
共用對象意味著使用者可以在不同的使用者之間、不同的同一台伺服器上的應用程式實體。FlashCom server 支援三種不同的共用對象:Local、remote和server-side。下面簡單介紹下這三個共用對象。
本地共用對象(Local shared object)
用於存取本地的資料,儲存在使用者的電腦硬碟中,並可以在不同的時間被其它應用程式訪問。本地共用對象的副檔名為.sol,預設的儲存路徑是 c:\documents and Settings\登入名稱稱\Application Data\Macromedia\Flash Player\伺服器網網域名稱稱\影片路徑\影片檔案名稱.swf\。本地共用對象也可以是短暫的,也就是說只有但應用程式運行時可用。我們也可以不串連 Flashcom server而使用本地共用對象。更多的本地共用對象的資訊,可以參考手冊中的SharedObject.getLocal方法。
建立和存取本地共用對象的方法如下:
1.
var so= SharedObject.getLocal('myCookie') //建立本地共用對象
2. //儲存資料
3. //注意:不管是讀取還是寫入資料到本地共用對象,都必須通過data屬性。
4.
so.data.userName='liu21st' ;
5.
so.data.msg='世紀流年' ;
6.
so.data.counter=10 ;
7.
//在預設狀態下,以上資料並不會馬上寫入使用者的磁碟,必須等到動畫被關閉,或者使用者離開你的網站後,才會寫入磁碟。如果要立即寫入的話,必須使用flush方法。如下:
8.
so.flush();
確認資料是否儲存成功可以通過onstatus事件來擷取
返回的code值為
SharedObject.Flush.Success(寫入成功)
SharedObject.Flush.Failed(寫入失敗)
程式碼範例:
1.
so.onStatus = function (info){
2. var
status=info.code ;
3. if (
status=='SharedObject.Flush.Success' ){
4.
trace('寫入成功' ); }
5. else
trace('寫入失敗');
遠程共用對象(remote shared object)
通過Flash影片的ActionScript程式,在伺服器端建立能讓不同聯機使用者共同存取的資料,稱為遠程共用對象。和本地共用對象一樣,遠程共用對象可以被本機電腦存取,不同的是在資料儲存在伺服器端,所以任何使用者都可以串連到遠程共用對象訪問到相同的資訊。預設的儲存路徑是應用程式實體路徑下的 sharedobjects檔案夾,副檔名是.fso。
遠程共用對象也是最常用的共用物件類型。每當聯機使用者(或伺服器端程式)更新遠程共用對象的內容,其它聯機到相同應用程式實體的使用者將自動收到更新內容的事件(onSync),保持彼此資料的同步。應用程式就是運用這個機制建立的。
例如,你可以開啟一個遠程共用對象,如電話號碼錶(在伺服器端持久有效)。當使用者端對該共用對象作任何更改的時候,修改後的資料對其他串連到該遠程共用對象的使用者是自同步的。如果因為某種原因,更新了本地的資料資訊但是沒有串連到伺服器,那麼所作的更改會在下一次串連到伺服器的時候同步遠程共用對象。
更多的資訊可以參考手冊中的SharedObject.getRemote方法。
建立遠程共用對象的方法:
1.
var client_nc = new NetConnection();
2.
client_nc.connect('rtmp://localhost/videochat/room1' );
3.
so = SharedObject.getRemote('records',client_nc.url); //資料資料不寫入磁碟
4.
so.connect(client_nc);
遠程共用對象的資料讀取和寫入方法和本地共用對象類似,也是通過data屬性和flush方法。
使用下面語句可以把資料資料寫入伺服器端應用程式檔案夾共用對象目錄
1.
so = SharedObject.getRemote('records',client_nc.url,true);
2.
//該語句遠程共用的檔案名稱將是records.fso
當遠程共用對象的內容改變或者初次聯機時,它都會向用戶端發出onsync (同步)事件,好讓所有聯機使用者都能即時取得最新的共用對象資料。
範例程式碼:
1.
so.onSync = function(list) {
2. for (var
k in list) {
3.
trace('name = ' + list[k].name + ', event = ' + list[k].code );
4. }
5.
// do whatever else you want to do here
6.
}
代理共用對象(proxied shared object)
代理共用對象是可以在使用者端和伺服器端共用的一種遠程共用對象,區別在於它是由伺服器端的ActionScript程式建立的,例如,在伺服器端有兩個室的實體chat01和chat02,在 chat02中可以串連到在chat01中定義的共用對象,更多的資訊可以參考手冊的 SharedObject.get方法。
和用戶端的sharedobject不同,設定共用變數的值要通過 SharedObject.setProperty,取得共用變數的值通過 SharedObject.getProperty 。
執行個體代碼:
1.
application.appStart = function() {
2.
nc = new NetConnection ();
3.
nc.connect('rtmp://' + master_server + '/' + master_instance );
4.
proxySO = SharedObject.get('myProxy',true,nc );
5.
// Now, whenever the client asks for a persistent
6. // shared object called myProxy they will receive myProxy
7. // shared object from the master_server/master_instance
8.
};
1.
myInfo = SharedObject.get('foo');
2. var
addr = myInfo.getProperty('address' );
3.
myInfo.setProperty('city', 'San Francisco' );
4. var
names = sharedInfo.getPropertyNames ();
5. for (
x in names ){
6. var
propVal = sharedInfo.getProperty(names[x ]);
7.
trace('Value of property ' + names[x] + ' = ' + propVal );
8. }
在使用遠程共用對象之前,請確認SharedObject.connect 返回 true,在用戶端調用SharedObject.flush 方法只是在本地拷貝了一份,要確保伺服器端的拷貝,必須在伺服器端使用SharedObject.flush 方法,如:
1.
// Sample server-side code for flushing a persistent shared object
2. // to the server
3. // Get the shared object when the application is loaded.
4.
application.onAppStart = function()
5. {
6.
application.mySO = SharedObject.get('SharedObjName', true );
7. }
8.
// When a user disconnects, flush the shared object.
9.
application.onDisconnect = function(client )
10. {
11.
application.mySO.flush ();
12. }
如果在同一時間有多個用戶端或者伺服器端在同步遠程共用對象的話,就會出現問題,要解決這個衝突可以通過下面的方法。
1. 使用不同的位置儲存不同使用者的資訊
這是最簡單的一種方法,例如,在室給每個使用者不同的位置存放資料,同步只修改自己的資料部分。
2. 分配資料所有者
複雜一點的方法就是定義一個使用者為有限的時間內該資料資料的所有者,所有者可以鎖定伺服器端的共用對象,直到返回可用資訊後方可同步另外的資料。下面是範例程式碼:(http://www.my400800.cn
)
通過一個記錄遊戲最高分的應用程式來說明解決同步衝突的問題,當前系統儲存的最高分是95,同時有兩個使用者打破了這個記錄,成績分別為105和110,如果不鎖定最高分的話,兩個成績都會同時執行updateHighScore方法,有可能其中一個成績會無法記錄下來。使用鎖定共用對象的方法解決了這樣一個問題。
1.
application.onAppStart = function()
2. {
3.
application.scoreSO = SharedObject.get('high_score_so', true );
4.
application.scoreSO.onSync = function(listVal )
{
trace('got an onSync on scoreSO' );
}
}
application.onConnect = function(newClient,name,passwd )
{
newClient.updateHighScore = function(final_score )
{
application.scoreSO.lock ();
if (
application.scoreSO.getProperty('high_score_so') < final_score )
{
application.scoreSO.setProperty('high_score_so', final_score );
}
application.scoreSO.unlock ();
}
}
3. 通知用戶端
當伺服器端收到用戶端的同步請求的時候,SharedObject.onSync事件會通知使用者端更改被拒絕,然後提供一個使用者介面來給使用者解決這種衝突。這種技術通常用於用戶端不是經常更新的情況。
4. 接受某些,拒絕其它的
應用程式根據“先到先服務”的原則來解決同步的衝突問題。通常需要於客戶自己重新請求來解決衝突。
5. 通過send方法來提高控制層級
SharedObject.send 命令給所有串連到該遠程共用對象的用戶端廣播訊息,也包括髮送者本人。 (編輯:非熊)