理解共享物件
共享物件可以儲存任何flash支援的資料型別。就存放位置來說,共享物件可以分成存在客戶端計算機的本地型,以及存放在伺服器上的遠端型。你可以用它來記錄使用者的相關資訊(如使用者名稱、性別和其它設定引數等),或者用在伺服器端,儲存其它聯機使用者實時分享的資訊(如聊天室的內容和線上使用者名單等)
共享物件意味著使用者可以在不同的使用者之間、不同的同一臺伺服器上的應用程式實體。flashcom server 支援三種不同的共享物件:local、remote和server-side。下面簡單介紹下這三個共享物件。
本地共享物件(local shared object)
var
so=
sharedobject
.getlocal
('mycookie'
) //建立本地共享物件so.
data
.username
='liu21st';so
.data
.msg
='世紀流年';so
.data
.counter=10
;//在預設狀態下,以上資料並不會馬上寫入使用者的磁碟,必須等到動畫被關閉,或者使用者離開你的**後,才會寫入磁碟。如果要立即寫入的話,必須使用flush方法。如下:so.
flush
();//儲存資料
//注意:不管是讀取還是寫入資料到本地共享物件,都必須通過data屬性。
確認資料是否儲存成功可以通過onstatus事件來獲取
返回的code值為
sharedobject.flush.success(寫入成功)
sharedobject.flush.failed(寫入失敗)
**示例:so.
onstatus
= function (
info
)trace
('寫入失敗'
);var
if (
else
遠端共享物件(remote shared object)
通過flash影片的actionscript程式,在伺服器端建立能讓不同聯機使用者共同訪問的資料,稱為遠端共享物件。和本地共享物件一樣,遠端共享物件可以被本地計算機訪問,不同的是在資料儲存在伺服器端,所以任何使用者都可以連線到遠端共享物件訪問到相同的資訊。預設的儲存路徑是應用程式實體路徑下的sharedobjects資料夾,副檔名是.fso。
遠端共享物件也是最常用的共享物件型別。每當聯機使用者(或伺服器端程式)更新遠端共享物件的內容,其它聯機到相同應用程式實體的使用者將自動收到更新內容的事件(onsync),保持彼此資料的同步。聊天室應用程式就是運用這個機制建立的。
例如,你可以開啟乙個遠端共享物件,如**號碼表(在伺服器端持久有效)。當使用者端對該共享物件作任何更改的時候,修改後的資料對其他連線到該遠端共享物件的使用者是自同步的。如果因為某種原因,更新了本地的資料資訊但是沒有連線到伺服器,那麼所作的更改會在下一次連線到伺服器的時候同步遠端共享物件。
更多的資訊可以參考手冊中的sharedobject.getremote方法。
建立遠端共享物件的方法:
var
client_nc
= new
netconnection
();client_nc
.connect
('rtmp://localhost/videochat/room1'
);so
= sharedobject
.getremote
('records'
,client_nc
.url
);//資料資料不寫入磁碟so.
connect
(client_nc);
遠端共享物件的資料讀取和寫入方法和本地共享物件類似,也是通過data屬性和flush方法。
使用下面語句可以把資料資料寫入伺服器端應用程式資料夾共享物件目錄
so =
sharedobject
.getremote
('records'
,client_nc
.url
,true
);//該語句遠端共享的檔名將是records.fso
當遠端共享物件的內容改變或者初次聯機時,它都會向客戶端發出onsync (同步)事件,好讓所有聯機使用者都能實時取得最新的共享物件資料。
示例**:so.
onsync
= function(list)
for (var }
**共享物件(proxied shared object)
.= function() ;
// shared object called myproxy they will receive myproxy
// shared object from the master_server/master_instance
myinfo
= sharedobject
.get
('foo'
);addr
= myinfo
.getproperty
('address'
);myinfo
.setproperty
('city'
, 'san francisco'
);names
= sharedinfo
.getpropertynames
();x in names)
在使用遠端共享物件之前,請確認sharedobject.connect 返回 true,在客戶端呼叫sharedobject.flush 方法只是在本地拷貝了乙份,要確保伺服器端的拷貝,必須在伺服器端使用sharedobject.flush 方法,如:
// sample server-side code for flushing a persistent shared object
.= function()
.myso
= sharedobject
.get
('sharedobjname'
, true
);// when a user disconnects, flush the shared object.
.ondisconnect
= function(
client).
myso
.flush
();// to the server
如果在同一時間有多個客戶端或者伺服器端在同步遠端共享物件的話,就會出現問題,要解決這個衝突可以通過下面的方法。
1. 使用不同的位置儲存不同使用者的資訊
這是最簡單的一種方法,例如,在聊天室給每個使用者不同的位置存放資料,同步只修改自己的資料部分。
2. 分配資料所有者
複雜一點的方法就是定義乙個使用者為有限的時間內該資料資料的所有者,所有者可以鎖定伺服器端的共享物件,直到返回可用資訊後方可同步另外的資料。下面是示例**:
通過乙個記錄遊戲最高分的應用程式來說明解決同步衝突的問題,當前系統儲存的最高分是95,同時有兩個使用者打破了這個記錄,成績分別為105和110,如果不鎖定最高分的話,兩個成績都會同時執行updatehighscore方法,有可能其中乙個成績會無法記錄下來。使用鎖定共享物件的方法解決了這樣乙個問題。
.= function()
.scoreso
= sharedobject
.get
('high_score_so'
, true);.
scoreso
.onsync
= function(
listval
)trace
('got an onsync on scoreso');.
onconnect
= function(
newclient
,name
,passwd
)newclient
.updatehighscore
= function(
final_score).
scoreso
.lock
();.
scoreso
.getproperty
('high_score_so'
) <
final_score).
scoreso
.setproperty
('high_score_so'
, final_score);.
scoreso
.unlock
();}}}
3. 通知客戶端
當伺服器端收到客戶端的同步請求的時候,sharedobject.onsync事件會通知使用者端更改被拒絕,然後提供乙個使用者介面來給使用者解決這種衝突。這種技術通常用於客戶端不是經常更新的情況。
4. 接受某些,拒絕其它的
應用程式根據「先到先服務」的原則來解決同步的衝突問題。通常需要於客戶自己重新請求來解決衝突。
5. 通過send方法來提高控制級別
sharedobject.send 命令給所有連線到該遠端共享物件的客戶端廣播訊息,也包括傳送者本人。
FCS程式設計之Client物件
client物件包含了每個聯機使用者的資訊,例如 客戶端的ip位址 flash和作業系統的資訊 分配使用者的頻寬以及呼叫客戶端的函式。該物件必須在伺服器端使用。clinet物件經常用來呼叫客戶端定義的方法,使用client.call方法 例如我們在客戶端定義了乙個獲取隨機數的方法 1 nc new ...
系統程式設計之共享記憶體
1.概述 共享記憶體是程序間通訊中最簡單的方式之一。共享記憶體允許兩個或更多程序訪問同一塊記憶體,就如同 malloc 函式向不同程序返回了指向同乙個物理記憶體區域的指標。當乙個程序改變了這塊位址中的內容的時候,其它程序都會察覺到這個更改。2.共享記憶體的特點 1.共享記憶體是程序間共享資料的一種最...
物件導向程式設計之術語
術語 含義屬性 一小段資訊,例如顏色 高度或重量,描述物件的乙個特性 字段物件內部的指定值 操作屬於物件的一段 方法操作的同義詞 訊息從乙個物件傳送到另乙個物件的請求 呼叫執行操作,以響應訊息 執行呼叫的同義詞 關聯兩個物件之間的直接或間接連線 聚合強關聯,隱含著某種部分 一體層次結構 復合強聚合,...