SharedObject.onSync的研究

先来看下面的这段服务器端代码(so.asc):

  1. application.onAppStart=function(){
  2.     so = SharedObject.get("test1",true);
  3.     so.onSync = function(l){
  4.         trace("SO已经更新!");
  5.     }
  6. }
  7. application.onConnect = function(c, appid, cid, p1, p2, p3){
  8.     application.acceptConnection(c);
  9.     so.setProperty(cid, p1);
  10.     trace(so.size());
  11. }

 

无论我怎样努力,我都无法让so.onSync执行,可是客户端的onSync却工作的很好!我想尽办法,用了2个小时的时间,最终还是失败。直到我在FCS的帮助中找到这段话:

Note: Changing or deleting a property on the server side using the SharedObject.setProperty() method always succeeds, so there is no notification of these changes.

看来,仔细研究帮助文件的每句话是非常有帮助的。我一直不知道在服务器端改变或者删除SharedObject属性是不会有通告的。

那么,如果是proxy SharedObject又会有怎样的情况?下面是一个例子,这个例子由一个客户端、两个服务器端程序组成。客户端的代码如下:

  1. var nc = new NetConnection();
  2. login_btn.onPress = function() {
  3.     nc.connect("rtmp:/"+ins0+"/"+ins1, ins1,ins2,ins3);
  4.     nc.onStatus = function(e) {
  5.         _root.info+=newline+e.code+""+e.description;
  6.     };
  7.     so = SharedObject.getRemote("test1",nc.uri,true);
  8.     so.connect(nc);
  9.     so.onSync = function(){
  10.             trace("SO已经更新!-"+so.data.length);
  11.     }
  12. };

其中,ins0、ins1、ins2、和ins3这四个变量分别关联着舞台上的四个输入文本域。而info这个变量则关联着舞台上的一个用户观看调试信息的动态文本域。

服务器端的程序proxyso中的代码如下(proxyso.acs):

  1. application.onAppStart=function(){
  2.     cc=this;
  3.     nc = new NetConnection();
  4.     nc.connect("rtmp://localhost/so/a");
  5.     nc.onStatus = function(info){
  6.         trace(info.code + "" + info.description);
  7.     }
  8.     proxySO = SharedObject.get("test1", true, nc);
  9.     proxySO.onSync = function(l){
  10.         trace("代理SO已经更新:"+proxySO.getPropertyNames());
  11.     }
  12.     proxySO.onStatus = function(info){
  13.         trace(info.code + "" + info.description);
  14.     }
  15. }
  16. application.onConnect = function(c, appid, cid, p1, p2, p3){
  17.     application.acceptConnection(c);
  18.     proxySO.setProperty(cid, p1);
  19. }

onAppStart事件中,我建立的SharedObject其实是连接到服务器端程序so中的,它被称为“代理SO(Proxied shared objects)”。在onConnect事件中,对这个“代理SO”,进行了更改,这个更改其实是作用到服务器端名为so的应用程序中的,我想这个代理SO应该可以接收到onSync事件,因为虽然它是位于服务器端,但是对于so这个应用程序来说,它却是一个客户机。

服务器端的程序so中的代码如下(so.acs):

  1. function getRandom(){
  2.     return new String(Math.random()*1000).split(".")[0];
  3. }
  4. application.onAppStart=function(){
  5.     proxySO = SharedObject.get("test1",true);
  6.     proxySO.onSync = function(l){
  7.         trace("proxySO已经更新:"+proxySO.getPropertyNames());
  8.         proxySO.setProperty("t"+getRandom(),"bb");
  9.         localSO.setProperty("t"+getRandom(),"bb");
  10.         trace("localSO"+localSO.getPropertyNames());
  11.     }
  12.     localSO = SharedObject.get("test2",true);
  13.     localSO.onSync = function(l){
  14.         trace("localSO已经更新:"+localSO.getPropertyNames());
  15.     }
  16. }
  17. application.onConnect = function(c){
  18.     application.acceptConnection(c);
  19. }

为了测试,在appStart中建立了两个SharedObject,proxySO就是被应用程序proxyso调用的代理SO,localSO则是应用程序so建立的本地SO,用于测试服务器端修改本地SO是否会触发onSync事件。

proxySO.onSync是一定会触发的。因为对它的更改是由proxyso进行的。在onSync触发的时候在本地对proxySO再进行一次更改,然后对localSO也进行一次更改。

如果判断正确,情况应该是这样:

  • 在so程序中的proxySO.onSync仅当被外部的客户机修改的时候才会触发,而本地修改的时候不触发。因此,当客户机swf连接的时候只会触发1次。
  • 在so程序中的localSO.onSync不会被触发。
  • 在proxyso程序中的so.onSync则只要test1被修改都会触发,因此,当客户机swf连接的时候,应该触发2次。
  • 客户机swf中的onSync因为是连接到proxyso的共享SO的,因此,(事实证明并不是)。

运行程序监测,得出以下结论:

  1. 在服务器端修改或删除服务器程序本地SO不会触发onSync事件
  2. 代理SO所在的服务器程序对代理SO修改或删除会触发代理SO的onSync事件;代理SO所连接的本地SO如果被本地程序修改,也会触发代理SO的onSync事件
  3. 连接到代理SO的swf客户机中的SO对象的onSync事件仅当代理SO被更改的时候触发,但是能够显示出对代理SO的所有更改

上面的最后一点值得解释一下。在刚才的猜测中,我判断客户机swf中so的onSync会执行两次。但经过试验发现仅为一次,这一次会反映出两次的修改,说明SO确实被修改了两次。至于这一次onSync是谁触发的,我认为是代理SO。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值