Server端和Client端的SharedObject互相呼叫對方的方法


Server端和Client端的SharedObject互相呼叫對方的方法
本文來源於 冰山上的播客 http://xinsync.xju.edu.cn , 原文地址:http://xinsync.xju.edu.cn/index.php/archives/1173

 
近來再做FMS上的東西, 一直使用NetConnection.call, application.client[index].call
來互相呼叫對方的方法,今天查看文檔的時候看到SharedObject也是可以互相呼叫方法的。
把我的僞代碼記錄如下 :
// ----------------------- NetConnection -------------------------
var HOST:String = "127.0.0.1";
var APP:String = "so";
 
var nc:NetConnection = new NetConnection( );
nc.onStatus = function( info:Object ):Void
{
        //for (var p in info)        trace(p+"--->"+info[p]);
        if (info.code == "NetConnection.Connect.Success")
        {
                createRemoteSO( );
        }
};
nc.connect("rtmp://"+HOST+"/"+APP, [p1, p2, p3 ....]);        // 連接到服務器
/*
服務器端的application.onConnect會接收Client傳遞過來的[p1, p2, p3 ....]
 
比如說
Clinet :
nc.connect("rtmp://"+HOST+"/"+APP, usernameVal, passwordVal);        // 連接到服務器
 
Server :
application.onConnect = function(clientObj, username, password)
{
        // client是一個Object, 包含了當前連接到FMS的Client的全部信息,
        // 可以通過 for(var prop:String in clientObj)        trace(prop+"---->"+clientObj[prop]);
        // 來查看到底clientObj內有哪些信息 :)
       
        // 檢查username, password是否合法, 這兩個參數就是Client通過NetConnection.connect傳遞過來的
       
        this.acceptConnection( clientObj );        // 接受連接
        // 接受連接也可以用 return true;
        // 當然也可以拒絕請求, 請查看SSAS上的application說明.
}
*/
 
// ----------------------- SharedObject -------------------------
var so:SharedObject;
function createRemoteSO( Void ):Void
{
        /*
        建立遠程序共享對象
        SharedObject.getRemote(objectName, URI [, persistence])
        objectName                so名
        URI                                要將SO建立到那條通道上.
        persistence                是否持久化, true則表示在服務器硬盤上生成該文件, 當FMS當掉該文件也是存在的;
                                        false表示僅在內存中維護該so文件, 當appStop該文件會消失.
                                        該參數可以省略, 省略或null則默認爲false.
        */
        so = SharedObject.getRemote("so", nc.uri, true);
        if( so.connect( nc ) )
        {
                so.getName = function( str:String ):Void
                {
                        // 通過SharedObject定義客戶端方法, 服務器可以呼叫該方法.
                        trace(str+"服務器調用getName成功!");
                }
                //so.onSync
                //so.onFirstSync
                so.data.name = "蹩腳饅頭";
                so.data.sex = "男";
        }
}
 
/**
* 服務器僞代碼
*/
application.allowDebug = true;
application.onAppStart = function()
{
        // TODO
}
application.onConnect = function( clientObj, username, password )
{
       
        this.acceptConnection( clientObj );
       
        /* 取Client在服務器端建立的so文件, 注意名字是一樣的都是"so"
        如果在服務器端你寫"soA", 那麼會創建一個新的SO文件(名字是soA),
        注意查看SSAS文檔對SharedObject的描述.
         */
        var so = SharedObject.get("so", true);
        // SSAS對 getPropertyNames 的描述是返回一個Array, 但是我測試出來是一個Object,
        // 應該是SSAS的問題, 我發現FMS的文檔上有很多地方有問題.
        var allProp = so.getPropertyNames( );        // 獲得so上的所有屬性
        /*
        在服務器端對so加減屬性不是通過 so.data.key = value這樣的形式了
        是通過
        so.setProperty(key, value);
        so.getProperty(key, value);
        還有
        我們都知道在Client端,如果你修改了so上的某個屬性值, 就會廣播這個事件出去,所有連接到
        同一個APP的Client都會接收到該廣播, onSync會被觸發
        但是在服務器端修改了so上的值是不會廣播的, 因爲服務器端認爲修改肯定是成功的,不需要廣播
        有興趣瞭解這個知識點的可以查看
        ZRong的Blog << SharedObject.onSync的研究 >>
        http://www.zengrong.net/?p=29#comment-11982
         */
        trace("type="+(typeof allProp));
        for(var i in allProp)
                trace(i+"----->**>>"+allProp[i]);
        so.send("getName", "HI");        // 通過服務器端的SO呼叫客戶端的方法, 那麼在服務器端定義方法, 在客戶端呼叫應該也是可行的。
本文來源於 冰山上的播客 http://xinsync.xju.edu.cn , 原文地址:http://xinsync.xju.edu.cn/index.php/archives/1173

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