`
wenbin151
  • 浏览: 31544 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics